gpt4 book ai didi

events - 使用 FOS User Bundle 和 Symfony2 注册时修改用户实体

转载 作者:行者123 更新时间:2023-12-04 14:29:15 25 4
gpt4 key购买 nike

很多人都知道,FOS 用户包在用户注册时不会自动提供角色。最常见的解决方案是 a) 修改 User 实体构造函数以自动分配角色,或 b) 覆盖整个注册 Controller 。

这些解决方案似乎都不是完美的,我想利用 FOS 用户包提供的事件。

我设法捕获了我想要的事件 ( FOSUserEvents::REGISTRATION_INITIALIZE ),但我无法弄清楚如何将修改后的 User 实体传递回注册表单。

我到目前为止的代码如下:

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
}
}

事件监听器的 YML:
services:
hc_labs_user.reg_init:
class: HCLabs\UserBundle\EventListener\AutoRoleAssignmentListener
tags:
- { name: kernel.event_subscriber }

如果需要更多代码,我很乐意提供。谢谢你的帮助。

最佳答案

答案很简单——你必须做没什么获取更新 User更新后注册表中的对象 UserFOSUserEvents::REGISTRATION_INITIALIZE 的事件监听器中事件。

让我解释。 FOSUserEvents::REGISTRATION_INITIALIZERegistrationController发货经过:

$dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, new UserEvent($user, $request));

并且,在代码( https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/RegistrationController.php#L43 )新的 User 中发送之前被 build :
    $user = $userManager->createUser();
$user->setEnabled(true);

$dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, new UserEvent($user, $request));

调度时,默认 PHP call_user_func ( http://php.net/manual/en/function.call-user-func.php ) 使用粘贴的事件名称(定义对象中的函数)和 Event 调用目的。之后,事件监听器有可能修改粘贴的 Event对象 - 特别是事件属性。

在您的情况下,您的事件监听器修改 User属性(property)通过:
$user = $event->getUser();
$user->addRole( 'ROLE_USER' );

因此,实际上,您无需执行任何操作即可将修改后的 User 实体传递回注册表单。

关于events - 使用 FOS User Bundle 和 Symfony2 注册时修改用户实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18213653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com