2013-10-11 5 views
7

私はfosユーザーバンドルとpugxマルチユーザーバンドルを使用しています。 私はすべてのドキュメントを読みましたが、私はSymfonyを初めて使用しています。 pugxマルチユーザバンドルには、すべてのポイントが1つのサンプルがありますが、1つはsucessful登録です。 生成フォーム用のコントローラをオーバーライドする成功した登録にどのように役割を割り当てるか?

  • サンプル=> 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'); 
        } 
    } 
    

    問題がマネージャを返す->get('pugx_multi_user.registration_manager')である:

は、ここに私のコードです。 fos user overring controllers helpには、formまたはform.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

「重要なことは、リスナーがアプリケーション内のすべてのエンティティをリッスンすることです。」...これは、永続化アクションがあるたびに、この関数は呼び出されますか?もしそうなら、そう言い訳がありますが、生徒や教師を登録するときのちょっとした行動のためにはちょっとしたことです...それはナットを裂くためのハンマーです。他に方法がないと確信していますか? –

+0

それは間違いなくデカップリングの点では良い方法です。 1-2の小さな 'instanceof'チェックインが本当にあなたを遅らせることはありません。それはあなたのためによく聞こえる場合は、[ライフサイクルコールバック](http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks)を使用して、エンティティに直接役割追加を統合することもできます。うーん、いくつかの方法があります、RegistrationControllerをオーバーライドし、成功した登録のイベントを発射してください... – nifr

+0

それです!私は抽象クラスである 'Person'と' Person'を実装する 'PersonTeacher'と' Person'を実装するPersonStudentを持っています。だから私は、各クラスのためのカスタム "ライフサイクル"コールバックを追加し、それはトリックを行う必要があります。あなたの答えにあなたのコメントを追加してもらえますか?これは誰でもこれを読むのに役立ちます。どうもありがとうございます。 –

関連する問題