2013-10-11 7 views
7

Ich benutze fos Benutzer Bundle und Pugx Multi User Bundle. Ich habe die gesamte Dokumentation gelesen und bin neu in Symfony. Im Pugx-Multi-User-Bundle gibt es ein Beispiel für jeden Punkt bis auf eine: erfolgreiche Registrierung.Wie weisen Sie Rollen bei erfolgreicher Registrierung zu?

  • einige Beispiele für das übergeordnete Steuerungen für Formen zu erzeugen => ok
  • einige Beispiele für das Überschreiben Vorlagen für Formen zu erzeugen => ok
  • einige Beispiele für das Überschreiben der erfolgreichen Registrierung Probe => nichts.

Hier ist mein Code:

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

Das Problem mit ->get('pugx_multi_user.registration_manager') ist, die einen Manager zurückgibt. In der fos user overring controllers help erhalten sie entweder eine form oder eine form.handler. Ich habe Schwierigkeiten, diese mit dem Manager "pugx_multi_user" zu verknüpfen.

Welchen Code soll ich in den registerTeacherAction() für Lehrer Rollen zu setzen, und in registerStudentAction() Rollen-Set für Schüler auf einer erfolgreichen Registrierung?

Antwort

9

Lösung 1 (Lehre Zuhörer/Subscriber)


Sie können leicht eine Lehre prePersistlistener/subscriber hinzufügen, die die Rollen/Gruppen Ihre Entitäten fügt je nach Typ vor persistierenden.

Der Zuhörer

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

     // ... 
    } 
} 

die Dienstkonfiguration

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

Lösung 2 (Lehre LifeCycle Rückrufe):


Mit lifecycle callbacks können Sie die Rollen-/Gruppenoperationen direkt in Ihre Entität integrieren.

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

Lösung 3 (Event-Dispatcher):


einen Ereignis-Listener/Teilnehmer für das "fos_user.registration.success" Ereignis registrieren.

How to create an event listener/Die EventDispatcher Komponente.

+1

Zitat des Links: 'Eine wichtige Sache zu beachten ist, dass ein Listener für alle Entitäten in Ihrer Anwendung zuhören wird. ... Dies bedeutet, dass jedes Mal, wenn es eine persistente Aktion gibt, * whatever * die persistente Entität ist, Diese Funktion wird aufgerufen? Wenn ja, entschuldige, dass ich es so sage, aber es ist ein bisschen zu viel für eine Aktion, wenn ich einen Schüler oder Lehrer anmelde ... das ist ein Vorschlaghammer, um eine Nuss zu knacken. Bist du sicher, dass es keinen anderen Weg gibt? –

+0

Nun, es ist definitiv ein guter Weg, um in Bezug auf die Entkopplung zu gehen. Die 1-2 kleinen "instanceofs" checken dort nicht wirklich ein. Sie könnten auch das Hinzufügen von Rollen direkt in Ihre Entitäten integrieren, indem Sie [Lebenszyklus-Callbacks] (http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks) verwenden, falls dies für Sie besser klingt. Nun, es gibt mehrere Möglichkeiten, den RegistrationController zu überschreiben, ein Ereignis bei erfolgreicher Registrierung auszulösen, ... – nifr

+0

Das war's! Ich habe "Person", die abstrakte Klasse ist, und "PersonTeacher", die "Person" und "PersonStudent" implementiert, die auch "Person" implementiert. Daher füge ich für jede Klasse einen benutzerdefinierten "Lebenszyklus" -Rückruf hinzu, und das sollte den Trick machen. Darf ich Sie bitten, Ihren Kommentar in Ihrer Antwort hinzuzufügen? Dies würde jedem helfen, dies zu lesen. Danke vielmals. –