2012-05-04 1 views
5

Sono assolutamente nuovo di Symfony2 ma sono già innamorato di questo framework.Symfony2: Come creare più moduli di registrazione con FOSUserBundle

Sto avendo un progetto che richiede di avere 3 diversi tipi di utenti.

Uno sarà un super amministratore, altri due saranno utenti regolari ma con layout di profilo diversi. Layout diversi per il profilo indica che il modulo di registrazione per questi due tipi di utente deve avere campi modulo diversi e layout diversi nell'applicazione dopo la registrazione.

Penso di avere l'idea (non so se andrà bene dopo) come gestire gli utenti dopo la registrazione. Ma per ora non capisco come costruire due diversi moduli di registrazione che verranno estesi da FOSUserBundle.

Per quanto ho capito FOSUB hanno un solo punto nella configurazione in cui la registrazione è impostato e non possono avere più "registrazione:"

Nel config.yml ho:

fos_user: 
    db_driver: orm 
    firewall_name: main 
    user_class: Company\UserBundle\Entity\User 
    registration: 
     confirmation: { enabled: true } 

sicurezza .yml:

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 

    main: 
     pattern: ^/ 
     form_login: 
      provider: fos_userbundle 
      csrf_provider: form.csrf_provider 
     logout:  true 
     anonymous: true 

La mia idea è quella di creare tre diversi pacchetti che si estende FOSUB, ma la documentazione dice che solo un fascio può dichiarare FOSUB come genitore.

Un'altra opzione (dalla documentazione) è di estendere ContainerAware implementando tutti i metodi originali. Ma anche in questo caso, non capisco come devo configurare app/config/{config | security | routing} .yml per avere per esempio/register_employee,/register_manager link che useranno FOSUB e i miei moduli personalizzati?

Per favore, indicami la giusta direzione. Grazie.

risposta

4

FOSUserBundle non fornisce l'autenticazione degli utenti ma la gestione degli utenti. Il pacchetto offre una struttura migliore per gestire gli utenti per la tua applicazione. Se date un'occhiata al codice, troverete i controller che vengono utilizzati per la registrazione predefinita e altre attività dell'utente.

Idealmente si vorrebbe scrivere il proprio controller e utilizzare il pacchetto per archiviare e recuperare solo gli utenti. Ciò è particolarmente richiesto quando si desidera gestire più moduli di registrazione/login.

Le cose sembrano più chiare una volta che si inizia a considerare FOSUserBundle solo per gestire gli utenti e non per autenticarli/registrarli.

Si potrebbe anche voler guardare https://github.com/sonata-project/SonataUserBundle, che fornisce l'integrazione tra SonataAdminBundle e FOSUserBundle.

+0

Sì, ho implementato la mia versione per la registrazione. È solo per la registrazione degli utenti, per altre funzionalità: promemoria, attivazione, ... Io uso l'implementazione standard di FOSUB. –

5

Sì, può essere possibile. Ma sarà una procedura complessa. Si può fare in seguito (io stesso Havn't provato però :))

  • Creare uno schema di rotta come /register/{type} e modificare registerAction conseguenza. Dai uno sguardo al documento this per i controller sovrascrivibili.

  • Nel metodo registerAction creare un'entità vuota User e impostare il tipo dall'argomento route. Quindi chiamare $form->setData(), e.g [1]

  • Override il RegistrationFormType per aggiungere un listener di eventi che ascolterà su FormEvents::PRE_SET_DATA evento data. Qui si aggiungeranno i campi modulo in modo dinamico in base al tipo. Controllare la voce di ricettario this.

  • Ora arriva la parte di convalida. Creare due tipi di gruppi di convalida per ciascun tipo di utente. È possibile impostare dinamicamente il gruppo di convalida in base ai dati inviati. Controllare here.

  • Se si desidera eseguire operazioni aggiuntive durante il salvataggio del modulo, è possibile ignorare il metodo onSuccess di RegistrationFormHandler. Verifica in fondo a this doc per farlo.

[1] come questo,

public function registerAction() 
{ 
    $form = $this->container->get('fos_user.registration.form'); 
    $user = new User(); 
    $form->setData($user); 
    //..... 
} 

Edit:

Terzo passo non funzionerà. È necessario sostituire il metodo process di RegistrationFormHandler per passare l'argomento di tipo dall'azione del controller.