私のアプリでは、ユーザーは時間の経過とともに無料ユーザーとプレミアムユーザーを切り替えることができます。サブスクリプションの有効期限が切れると、プレミアム特権はなくなります。
プレミアムユーザーの役割をデータベースに保存せず、支払った日付のみを保存することで、ユーザーからプレミアムユーザーの役割を削除するために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');
}
}
}