В моем приложении пользователи могут переключаться между свободным пользователем и премиум-пользователем с течением времени, когда срок их подписки истекает, у них больше нет премиальных премий.
Я думал, что могу сократить угол, а не хранить премиум-роль пользователя в базе данных, хранить только дату, в которую они заплатили, тем самым устраняя необходимость выполнения задания 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
, что-то вроде этого:
<?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
), поэтому сейчас очень мало сделать:
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 }
Компонент диспетчера событий
Как создать прослушиватель событий
Логин Перенаправление Dustin Dobervich : Этот пост даст вам хороший пример того, как работают слушатели, и как вы можете просто реализовать их при входе в систему.