【问题标题】:In FOSUserBundle, How to initially set user role on REGISTRATION_COMPLETED event?在 FOSUserBundle 中,如何在 REGISTRATION_COMPLETED 事件上初始设置用户角色?
【发布时间】:2013-11-29 19:26:03
【问题描述】:

我正在尝试为每个成功注册的用户分配一个ROLE_USER 角色。我是 FOSUserBundle 的新手,所以从我在文档中阅读的内容来看,它是通过将逻辑插入控制器来完成的。

这是我的NewUserGroupSet 事件监听器:

<?php
namespace Tsk\TstBundle\EventListener;

use Doctrine\ODM\MongoDB\DocumentManager;
use FOS\UserBundle\Doctrine\UserManager;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class NewUserGroupSet implements EventSubscriberInterface
{
    protected $um;
    protected $dm;
    public function __construct(UserManager $um, DocumentManager $dm)
    {
        $this->um = $um;
        $this->dm = $dm;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_COMPLETED => "onRegistrationSuccess",
        );
    }

    public function onRegistrationSuccess(FilterUserResponseEvent $event)
    {
        $user = $event->getUser();
        $user->setRoles(array('ROLE_USER'));
        $this->um->updateUser($user);
        $this->dm->flush();
    }
}
?>

并注册为服务如下:

parameters:
    tsk_user.group_set.class: Tsk\TstBundle\EventListener\NewUserGroupSet

services:
    tsk_user.group_set:
        class: %tsk_user.group_set.class%
        arguments: [@fos_user.user_manager, @doctrine.odm.mongodb.document_manager]
        tags:
            - { name: kernel.event_subscriber }

但是当我注册一个新用户时,什么都没有发生。没有设置任何角色。

任何帮助将不胜感激。

【问题讨论】:

    标签: php events symfony fosuserbundle


    【解决方案1】:

    您是否尝试过调用addRole() FOSUser 实体函数,如果您注意到实体中的 setRole 函数,它正在遍历数组到角色并将其传递给addRole

    public function setRoles(array $roles)
    {
        $this->roles = array();
    
        foreach ($roles as $role) {
            $this->addRole($role);
        }
    
        return $this;
    }
    

    尝试使用addRole() 获取单个角色

    public function onRegistrationSuccess(FilterUserResponseEvent $event)
    {
        $user = $event->getUser();
        $user->addRole('ROLE_USER');
        $this->um->updateUser($user);
        $this->dm->flush();
    }
    

    【讨论】:

    • @RafaelAdel 仔细阅读this answer 声明 默认情况下,创建的用户具有角色 ROLE_USER,该角色保存在 DB 中,如转换为 JSON a:0 的空数组:{}创建用户后尝试var_dump($this-&gt;getRoles())
    • 啊,我明白了。我尝试添加ROLE_ADMIN 角色并且它起作用了。非常感谢您的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多