如何在成功注册时分配角色?

Oli*_*ons 8 controller symfony fosuserbundle pugxmultiuserbundle

我正在使用fos用户捆绑和pugx多用户捆绑.我已经阅读了所有文档,我是Symfony的新手.在pugx多用户包中,每个点都有一个样本,但只有一个:成功注册.

  • 用于生成表单的覆盖控制器样本=> ok
  • 用于生成表单的覆盖模板的示例=> ok
  • 覆盖成功注册样本的样本=>没有.

这是我的代码:

class RegistrationController extends BaseController
{
    public function registerAction(Request $request)
    {   
        $response = parent::registerAction($request);
        return $response;
    }   

    public function registerTeacherAction()
    {   
        return $this->container
            ->get('pugx_multi_user.registration_manager')
            ->register('MyBundle\Entity\PersonTeacher');
    }   

    public function registerStudentAction()
    {   
        return $this->container
            ->get('pugx_multi_user.registration_manager')
            ->register('MyBundle\Entity\PersonStudent');
    }   
}
Run Code Online (Sandbox Code Playgroud)

问题是->get('pugx_multi_user.registration_manager')返回经理.在fos用户覆盖控制器帮助中,他们得到a form或a form.handler.我很难将这些与pugx_multi_user管理器"链接"起来.

我应该在registerTeacherAction()为教师设置角色时设置什么代码,以及registerStudentAction()成功注册设置学生角色?

Nic*_*ich 9

解决方案1(Doctrine Listener/Subscriber)


您可以轻松添加一个教义prePersist 侦听器/订阅者,在持久化之前根据其类型将角色/组添加到您的实体.

听众

namespace Acme\YourBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Acme\YourBundle\Entity\Student;

class RoleListener
{
    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        // check for students, teachers, whatever ...
        if ($entity instanceof Student) {
            $entity->addRole('ROLE_WHATEVER');
            // or
            $entity->addGroup('students');
            // ...
        }

       // ... 
    }
}
Run Code Online (Sandbox Code Playgroud)

服务配置

# app/config/config.yml or load inside a bundle extension
services:
    your.role_listener:
        class: Acme\YourBundle\EventListener\RoleListener
        tags:
            - { name: doctrine.event_listener, event: prePersist }
Run Code Online (Sandbox Code Playgroud)

解决方案2(Doctrine LifeCycle Callbacks):


使用生命周期回调,您可以将角色/组操作直接集成到您的实体中.

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks()
 */
class Student
{
    /**
     * @ORM\PrePersist
     */
    public function setCreatedAtValue()
    {
        $this->addRole('ROLE_WHATEVER');
        $this->addGroup('students');
    }
Run Code Online (Sandbox Code Playgroud)

解决方案3(事件调度程序):


"fos_user.registration.success"事件注册事件侦听器/订阅者.

如何创建事件侦听器/EventDispatcher组件.