3

私のアプリでは、ユーザーは時間の経過とともに無料ユーザーとプレミアムユーザーを切り替えることができます。サブスクリプションの有効期限が切れると、プレミアム特権はなくなります。

プレミアムユーザーの役割をデータベースに保存せず、支払った日付のみを保存することで、ユーザーからプレミアムユーザーの役割を削除するためにcronジョブを追加する必要がなくなると思いました。

私が考えていた解決策は、ユーザーエンティティでこれを行うことでした。

public function __construct()
{
    if ( $this->hasPlus() )
    {       
        $this->addRole('ROLE_PLUSUSER');
    }
}

ここで、hasPlusは、現在の日付を支払済みの日付と比較し、ユーザーがまだ支払っている場合はtrueを返す関数です。

今、これは機能しないので、誰かが私のためにこれに光を当てることができるかもしれないと思っていました-ログイン時に役割が追加されることを知っています、そしてログイン後に役割を追加する場合は、ログアウトして再度ログインする必要があります効果がありますが、ここではユーザーオブジェクトの作成時にロールを追加しようとしていますが、それでも機能しません...

以下の優れた回答に従ってeventListenerを追加しましたが、それでもユーザーにロールを追加することはできません。

<?php

namespace Hemekonomi\UserBundle\EventListener;

use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpFoundation\Session;


class SecurityListener
{
    protected $security;
    protected $session;

/**
* Constructs a new instance of SecurityListener.
*
* @param SecurityContext $security The security context
* @param Session $session The session
*/
    public function __construct(SecurityContext $security, Session $session)
    {
        //You can bring whatever you need here, but for a start this should be useful to you
        $this->security = $security;
        $this->session = $session;
    }

/**
* Invoked after a successful login.
*
* @param InteractiveLoginEvent $event The event
*/
    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {
         //Your logic needs to go here
         //You can addRole 
         //Even persist if you want but bring the right tools to your constructor
         $security = $this->security; 

         if ($security->getToken()->getUser()->hasPlus()) {       
            $security->getToken()->getUser()->addRole('ROLE_PLUSUSER');    
         }

    }
}
4

1 に答える 1

2

あなたのロジックはuserエンティティでは機能しません...

達成したいことがログイン時にある場合はEvent Listeners、を使用してください。それが非常に便利な理由です:-)

作成する必要があるのはInteractiveLoginEvent、次のようなイベントに反応するリスナーです。

1/ リスナーを作成する

<?php

namespace Acme\YourBundle\EventListener;

use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpFoundation\Session\Session;


class SecurityListener
{
    protected $security;
    protected $session;

/**
* Constructs a new instance of SecurityListener.
*
* @param SecurityContext $security The security context
* @param Session $session The session
*/
    public function __construct(SecurityContext $security, Session $session)
    {
        //You can bring whatever you need here, but for a start this should be useful to you
        $this->security = $security;
        $this->session = $session;
    }

/**
* Invoked after a successful login.
*
* @param InteractiveLoginEvent $event The event
*/
    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {
         //Your logic needs to go here
         //You can addRole 
         //Even persist if you want but bring the right tools to your constructor
    }
}

Symfony ではデフォルトでInteractiveLoginEventuseが既に作成されていることに注意してください (ステートメントでわかるように)。

2/ このリスナーをサービスとして宣言します。

services:
    acme_your_bundle.listener.login:
        class: Acme\YourBundle\EventListener\SecurityListener
        arguments: [@security.context, @session]
        tags:
            - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin }

3/ 必要に応じてドキュメントを確認してください

イベント ディスパッチャ コンポーネント

イベント リスナーの作成方法

Login Redirection by Dustin Dobervich : この投稿では、リスナーがどのように機能し、ログイン時に簡単に実装できるかについての良い例を紹介します。

于 2012-09-07T06:25:46.833 に答える