2012-05-04 14 views
5

Soy totalmente nuevo en Symfony2 pero ya estoy enamorado de este framework.Symfony2: Cómo crear múltiples formularios de registro con FOSUserBundle

Estoy teniendo un proyecto que requiere tener 3 tipos de usuario diferentes.

Uno será súper administrador, otros dos serán usuarios regulares pero con diferentes diseños de perfil. Los diferentes diseños para el perfil significa que el formulario de registro para esos dos tipos de usuario debe tener diferentes campos de formulario y diferentes diseños en la aplicación después del registro.

Creo que tengo la idea (no sé si eso estará bien más adelante) de cómo administrar a los usuarios después del registro. Pero por ahora no entiendo cómo crear dos formularios de registro diferentes que se extenderán desde FOSUserBundle.

En lo que a entender FOSUB tiene un solo punto en la configuración en el registro está establecido y no puede tener múltiples "inscripción:"

En el config.yml tengo:

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

seguridad .yml:

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

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

Mi idea es crear tres paquetes diferentes que se extiende FOSUB, pero la documentación dice que sólo un paquete puede declarar FOSUB como padre.

Otra opción (de la documentación) es ampliar ContainerAware implementando todos los métodos originales. Pero incluso en este caso, no entiendo cómo tengo que configurar app/config/{config | security | routing} .yml para que tenga por ejemplo/register_employee,/register_manager enlaces que usarán FOSUB y mis formularios personalizados.

Por favor, dirígeme a la dirección correcta. Gracias.

Respuesta

4

FOSUserBundle no es para proporcionar autenticación de usuarios sino para administrar usuarios. El paquete le proporciona una mejor estructura para administrar usuarios para su aplicación. Si echas un vistazo al código, encontrarás los controladores que se usan para el registro predeterminado y otras actividades del usuario.

Lo ideal es que desee escribir su propio controlador y utilizar el paquete para almacenar y recuperar usuarios. Esto es especialmente necesario cuando desea administrar múltiples formularios de registro/inicio de sesión.

Las cosas parecerían más claras una vez que comience a considerar FOSUserBundle solo para administrar usuarios y no para autenticarlos/registrarlos.

Es posible que también desee consultar https://github.com/sonata-project/SonataUserBundle, que proporciona integración entre SonataAdminBundle y FOSUserBundle.

+0

Sí, he implementado mi propia versión para el registro. Solo es para registrar usuarios, para otras funcionalidades: recordatorio, activación, ... Uso la implementación estándar de FOSUB. –

5

Sí, puede ser factible. Pero será un procedimiento complejo. Puede hacer lo siguiente (I havn't probé a mí mismo aunque :))

  • crear un patrón de ruta como /register/{type} y modificar registerAction en consecuencia. Eche un vistazo a this doc para anular los controladores.

  • En el método registerAction crear una entidad en blanco User y establecer el tipo del argumento de la ruta. Luego llame al $form->setData(), e.g [1]

  • Override la RegistrationFormType para añadir un detector de eventos que escuchar en FormEvents::PRE_SET_DATA evento de datos. Aquí agregará campos de formulario dinámicamente en función del tipo. Compruebe this entrada del libro de cocina.

  • Ahora viene la parte de validación. Cree dos tipos de grupos de validación para cada tipo de usuario. Puede establecer dinámicamente un grupo de validación según los datos enviados. Compruebe here.

  • Si desea realizar una operación adicional durante el guardado de formularios, puede anular el método onSuccess de RegistrationFormHandler. Consulte en la parte inferior del documento this para hacer eso.

[1] como este,

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

Editar:

tercer paso no funcionará. Debe sobrescribir el método process de RegistrationFormHandler para pasar el argumento de tipo desde la acción del controlador.

Cuestiones relacionadas