jrd*_*rdn 6 service events symfony fosuserbundle
许多人都知道,当用户注册时,FOS用户包不会自动提供角色.最常见的解决方案是:a)修改User实体构造函数以自动分配角色,或b)覆盖整个注册控制器.
这些解决方案似乎都不完美,我想利用FOS用户包提供的事件.
我已设法捕获我想要的事件(FOSUserEvents::REGISTRATION_INITIALIZE),但我无法弄清楚如何将修改后的用户实体传递回注册表单.
我到目前为止的代码如下:
namespace HCLabs\UserBundle\EventListener;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use FOS\UserBundle\Event\UserEvent;
use FOS\UserBundle\Model\UserInterface;
class AutoRoleAssignmentListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [ FOSUserEvents::REGISTRATION_INITIALIZE => 'onRegistrationInitialise' ];
}
public function onRegistrationInitialise( UserEvent $event )
{
$user = $event->getUser();
$user->addRole( 'ROLE_USER' );
// what do
}
}
Run Code Online (Sandbox Code Playgroud)
事件监听器的YML:
services:
hc_labs_user.reg_init:
class: HCLabs\UserBundle\EventListener\AutoRoleAssignmentListener
tags:
- { name: kernel.event_subscriber }
Run Code Online (Sandbox Code Playgroud)
如果需要更多代码,我很乐意提供.谢谢你的帮助.
答案很简单-你必须做什么,以获取更新User的对象在更新后的登记表User中的事件侦听器FOSUserEvents::REGISTRATION_INITIALIZE的事件.
让我解释.由以下人员FOSUserEvents::REGISTRATION_INITIALIZE发送RegistrationController:
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, new UserEvent($user, $request));
Run Code Online (Sandbox Code Playgroud)
并且,在此代码发送之前(https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/RegistrationController.php#L43)User创建了新的:
$user = $userManager->createUser();
$user->setEnabled(true);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, new UserEvent($user, $request));
Run Code Online (Sandbox Code Playgroud)
在调度期间,默认情况下,使用粘贴的事件名称(定义的对象中的函数)和对象调用PHP call_user_func(http://php.net/manual/en/function.call-user-func.php)Event.之后,事件监听器可以修改粘贴的Event对象 - 特别是事件属性.
在您的情况下,您的事件侦听器User通过以下方式修改属性
$user = $event->getUser();
$user->addRole( 'ROLE_USER' );
Run Code Online (Sandbox Code Playgroud)
所以实际上,您必须不做任何事情才能将修改后的用户实体传递回注册表单.
| 归档时间: |
|
| 查看次数: |
6562 次 |
| 最近记录: |