FOSUserBundle Symfony2

Merkury

Buenas noches gentecilla.

Vuelvo por aqui con una duda relacionada con Symfony2 y el FOSBundle.

Ahora mismo tengo una Entidad User que extiende de la entidad User del FOS lo que le da el username, password, salt, etc..

Entonces en el controlador a la hora de ir a crear el formulario de registro (estoy haciendolo sin overridear los que trae FOS) cuando hago la creación del usuario todo esta bien excepto que la contraseña no la encripta como es debido, adjunto imagen:

Podeis ver mi usuario que esta creado por consola y el de prueba creado a través del form.

El controlador del form es el siguiente


 public function createAction(Request $request)
    {

    $userManager = $this->get('fos_user.user_manager');

    $user = $userManager->createUser();

    $form = $this->createForm(new UserType(), $user);

    if($request->isMethod('POST'))
    {
        $form->bind($request);
        if($form->isValid())
        {
            $userManager->updateUser($user);
            $this->get('session')->getFlashBag()->add('notice', '¡Creación realizada con exito!');
            return $this->redirect($this->generateUrl('user_gestion_index'));
        }
    }
    return $this->render('AcmeAdminBundle:UserAdmin:newuser.html.twig', array('createForm'=>$form->createView()));
}
}

No entiendo porque es esto, no se si es que tengo que hacer el override de los FormTypes que incluye FOS o que.. a ver si alguien me puede echar una mano :D

Cobre

Prueba esto a ver si te funciona:

$user->setPlainPassword($pass);

1 respuesta
Merkury

#2 Pero si eso lo único que va a hacer es setear una contraseña a rasquete...

El problema es que el FOSUserBundle tal como va programado no consigo que me haga la encriptación.

Setear una contraseña a rasquete en el controller, no es que no sirva de nada, es que es una estupidez.

Cobre

La verdad es que nunca lo he echo lo que pense es que tu en el formulario editabas el campo password directamente, y que lo que habia que hacer es el crear el PlainPassword y el ya se encargaria de codificartela.

Por cierto cuando encuentres la solucion, comentala aqui que yo tambien ando trasteando con el symfony!

1 respuesta
Merkury

#4 Si la encuentro la posteare no te preocupes.

Pero lo que estoy haciendo es intentar utilizar el FOSuserbundle para el login, registro, etc.

Lo que pasa que cuando tienes una Entidad usuario que extiendes del FOS, con campos como son nombre, apellidos, etc. a la hora de crear el form de registro tienes que hacerte uno personalizado en base a la entidad de User, pero si no utilizas el handler del FOS, la contraseña no te la encripta, pero es extraño porque por ejemplo el SALT que va encriptado, si...

Merkury

Bueno despues de MUCHAS HORAS he conseguido adaptar el register form de FOSUserBundle para poder crear usuarios desde mi panel de gestión con los datos adaptados a mis necesidades y poder generar diferentes formularios de registro.

Lo que hay que hacer, una vez instalado el FOS, es hacer el override del RegistrationFormType, esto se hace teniendo generado tu FormType en base a tu entidad propia y el codigo queda así:

<?php

namespace Acme\UserBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;

class UserType extends BaseType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);
        $builder
            ->add('nombre')
            ->add('apellidos')
            ->add('fechaNacimiento')
            ->add('fbAccount')
            ->add('twAccount')
            ->add('gplusAccount')
        ;
    }

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Acme\UserBundle\Entity\User'
    ));
}

public function getName()
{
    return 'acme_userbundle_usertype';
}

En esta parte, lo que hay que hacer es que la clase en vez de hacer extends de AbstractType lo haga de FOS\UserBundle\Form\Type\RegistrationFormType (que en el use le pones el alias BaseType.

Una vez hecho esto, en el controlador, simplemente definiremos el form de forma normal, con una excepción, el RegistrationFormType, implementa por defecto un constructor de clase, con lo que en la definición del form, le pasaremos el nombre que retorna el FormType que tenemos creado, asi:

 $form = $this->createForm(new UserType('acme_userbundle_registertype'), $user);

Y finalmente solo nos quedaría controlar el envío del form y hacer el render :D

Espero que a alguien le sirva.

2

Usuarios habituales

  • Merkury
  • Cobre