2013-10-11 10 views
7

Fos kullanıcı paketi ve pugx çoklu kullanıcı paketi kullanıyorum. Tüm belgeleri okudum ve Symfony'de yeniyim. Pugx çoklu kullanıcı paketinde her noktada bir örnek var, ancak bir tanesi: başarılı bir kayıt. başarılı kayıt örneği => Hiçbir şey geçersizleştirebilir Başarılı kayıtlarda rol nasıl atanır?

  • Numuneler Tamam formları => üreten için ok formları => basan şablonlardan
  • Numuneler üretmek için geçersiz kılma denetleyicilerin

    • örnekler.

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

      problem yöneticisi döndürür ->get('pugx_multi_user.registration_manager') ile geçerli:

    İşte benim kod. fos user overring controllers help'da, form veya form.handler olsun. Bunları pugx_multi_user yöneticisi ile "bağlamak" için zor anları yaşıyorum.

    Ben öğretmen için roller ayarlamak için registerTeacherAction() gördüğünüz kod koymak gerektiğini ve registerStudentAction() başarılı bir kayıt üzerinde öğrenci için roller kurulur?

  • cevap

    9

    Çözüm 1 (Doktrin Dinleyici/Abone)


    Kolayca ısrarlı önce kendi türüne bağlı kuruluşlara roller/grupları ekleyen bir doktrin prePersistlistener/subscriber ekleyebilir.

    dinleyici

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

    hizmet yapılandırma

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

    Çözelti 2 (doktrini LifeCycle geri aramalar):


    lifecycle callbacks'u kullanarak, rol/grup işlemlerini doğrudan kuruluşunuza entegre edebilirsiniz.

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

    Çözüm 3 (Olay Dispatcher):


    "fos_user.registration.success" olay için bir olay dinleyicisi/aboneyi kaydedin.

    How to create an event listener/EventDispatcher bileşeni.

    +1

    Linkin Alıntı: 'Dikkat edilmesi gereken önemli bir nokta, bir dinleyicinin uygulamanızdaki tüm varlıkları dinleyeceğidir.” Bu, her seferinde ısrarcı bir eylemin var olduğunu ima eder, * ısrarlı varlık ne olursa olsun, Bu işlev çağrılacak? Eğer öyleyse, bu şekilde söylememe izin verin, ama bir öğrenciyi veya bir öğretmeni kayıt ettirirken sadece bir eylem için biraz fazla bir şey var ... bu bir çeşit somunu kırmak için bir balyoz kullanır. Başka yolu olmadığından emin misin? –

    +0

    de kesinlikle dekuplaj açısından gitmek için iyi bir yoldur. Orada 1-2 küçük 'instanceof' kontrolleri sizi gerçekten yavaşlatmayacak. Eğer sizin için daha iyi seslerse, rol eklemeyi doğrudan [varlık döngüsü geri çağrıları] (http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks) kullanarak kendi varlıklarınıza entegre edebilirsiniz. Eh, birkaç yolu vardır, RegistrationController geçersiz kılma, başarılı kayıt bir olay ateş, ... – nifr

    +0

    İşte bu! Ben soyut kişiliğim olan 'Kişiyi 've' Kişiyi 'uygulayan' Kişi 've' PersonStudent'i uygulayan 'PersonTeacher' var. Bu yüzden her bir sınıf için özel "yaşam döngüsü" geri bildirimi ekleyeceğim ve bu hile yapmalı. Yorumunuzu cevabınıza eklemenizi rica edebilir miyim? Bu, bunu okuyan herkese yardımcı olur. Gerçekten çok teşekkür ederim. –