2013-10-11 26 views
7

我使用的是fos用户包和pugx多用户包。 我已阅读所有文档,我是Symfony的新手。 在pugx多用户捆绑包中,除了一个点外,还有一个示例:成功注册。重写控制器如何在成功注册时分配角色?

  • 样品为产生形式=>确定的覆盖模板
  • 样品为产生形式=>确定重写成功注册样品=>无的
  • 样品。

这里是我的代码:

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'); 
    } 
} 

问题是与->get('pugx_multi_user.registration_manager')它返回一个经理。在fos user overring controllers help中,他们得到formform.handler。我很难与pugx_multi_user管理器“链接”。

我应该把什么代码在registerTeacherAction()设置教师的角色,并在registerStudentAction()就注册成功设置学生角色?

回答

9

解决方案1(教义监听器/用户)


您还可以轻松添加学说prePersistlistener/subscriber,增加了角色/组,根据不同的类型之前坚持你的实体。

侦听

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'); 
      // ... 
     } 

     // ... 
    } 
} 

服务配置

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

溶液2(学说生命周期回调):


使用lifecycle callbacks,您可以将角色/组操作直接集成到实体中。

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

溶液3(事件分派器):


注册为"fos_user.registration.success"事件的事件监听器/订户。

How to create an event listener/EventDispatcher组件。

+1

引用链接:'要注意一个重要的事情是,听众将聆听您的application.'所有实体......这意味着,每次有一个持续的行动,无论* *的坚持实体,这个函数会被调用吗?如果是这样,请原谅我说这样的说法,但注册学生或教师时,这是一个有点吃不消只是一个动作...这是一种使用大锤牛刀。你确定没有其他办法吗? –

+0

好吧,它绝对是脱钩方面的一个好方法。在那里1-2小''instanceof'检查不会真的让你失望。你可以藏汉整合使用[生命周期回调(http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks)如果这听起来更好地为您直接作用,加入到你的实体。那么有几种方法,重写这个RegistrationController上成功注册触发事件,... – nifr

+0

就是它了!我有'Person'这个抽象类,'PersonTeacher'实现'Person'和'PersonStudent'也实现'Person'。所以我会为每个类添加自定义的“生命周期”回调,并且这应该可以做到。我可以请你在你的回答中添加你的评论吗?这将有助于任何人阅读。非常感谢你。 –

相关问题