как динамически добавлять роли пользователей при входе в систему с помощью symfony2 (и fosUserBundle)?

В моем приложении пользователи могут переключаться между свободным пользователем и премиум-пользователем с течением времени, когда срок их подписки истекает, у них больше нет премиальных премий.

Я думал, что могу сократить угол, а не хранить премиум-роль пользователя в базе данных, хранить только дату, в которую они заплатили, тем самым устраняя необходимость выполнения задания cron, в котором och удаляет премию за роль от моих пользователей.

Решением, которое я имел в виду, было сделать это в пользовательском объекте:

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'); } } } 

Ваша логика не будет работать на 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 } } 

Имейте в виду, что InteractiveLoginEvent уже создан по умолчанию в Symfony (как вы можете видеть в инструкции use ), поэтому сейчас очень мало сделать:

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 / Проверьте документ, если вам нужно

Компонент диспетчера событий

Как создать прослушиватель событий

Логин Перенаправление Dustin Dobervich : Этот пост даст вам хороший пример того, как работают слушатели, и как вы можете просто реализовать их при входе в систему.