Modification de l'utilisateur de base, toutes les données à null

SQLSTATE[23000]: Integrity constraint violation

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

je travaille actuellement avec Symfony 3 et FOSUserBundle. Je souhaite que les utilisateurs puissent s’inscrire seulement avec l’adresse e-mail, le pseudo est optionel et le mot de passe sera généré du côté serveur.

Pour ce qui est de la surcharge de l’entité User, il n’y a pas de soucis j’ai correctement modifiés les paramètres avec doctrine en ajoutant ces annotations avant la définition de la classe :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="PP\UserBundle\Repository\UserRepository")
 *
 * @ORM\AttributeOverrides({
 *      @ORM\AttributeOverride(
 *          name="username",
 *          column=@ORM\Column(
 *              length=50,
 *              nullable=true
 *          )
 *      ),
 *      @ORM\AttributeOverride(
 *          name="usernameCanonical",
 *          column=@ORM\Column(
 *              nullable=true
 *          )
 *      )
 * })
 */

J’ai ré-écrit le formulaire d’inscription :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
namespace PP\UserBundle\Form;

use FOS\UserBundle\Util\LegacyFormHelper;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', null)
            ->add('email', LegacyFormHelper::getType('Symfony\Component\Form\Extension\Core\Type\EmailType'));
    }

    public function getBlockPrefix()
    {
        return 'pp_user_registration';
    }
}

J’ai définit le formulaire en tant que service :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

    pp.form.registration:
        class: PP\UserBundle\Form\RegistrationType
        tags:
            -
                name: form.type
                alias: pp_user_registration

J’ai mis à jour la configuration de FOSUserBundle :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
fos_user:
    db_driver: orm
    firewall_name: main
    user_class: PP\UserBundle\Entity\User
    from_email:
        address: '%mailer_user%'
        sender_name: '%mailer_user%'
    registration:
        form:
            type: PP\UserBundle\Form\RegistrationType

Pour le moment, je ne cherche pas à faire de validation, mais seulement comprendre comment insérer les données avec une entitée User modifiée. J’ai alors commenté toutes les contraintes de propriété pour l’inscription dans vendor/friendsofsymfony/user-bundle/Resources/config/validation.xml. Symfony ne fait donc aucune vérification des contraintes après la soumission du formulaire, celui-ci est toujours valide.

Dans mon formulaire, l’utilisateur peut saisir un pseudo s’il le souhaite ou laisser vide s’il n’en veux pas. Seulement voilà, les données ne sont pas récupérées, en effet après la soumission du formulaire j’ai tous les champs à NULL même lorsque j’entre un pseudo :

1
2
3
An exception occurred while executing 'INSERT INTO user (username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params [null, null, null, null, 1, null, null, null, null, null, "a:0:{}"]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'email' cannot be null

Je ne comprends pas le problème. Quelqu’un pourrais t-il m’aider ? Merci :)

+0 -0
Auteur du sujet

Pourquoi ne pas utiliser le login par e-mail?

Le login par e-mail c’est exactement ce que je fais, j’ai déjà changé ce paramètre.

Et au pire dans le setter, mettre le pseudo égal à l’e-mail ?

J’ai déjà vu un code faisant ça, mais je préfère utiliser les champs pour ce pourquoi ils ont étés prévus.

Édité par Halarp27

+0 -0
Auteur du sujet

Cette réponse a aidé l'auteur du sujet

J’ai trouvé la solution à mon problème, il venait du controlleur. Par défaut le controlleur RegistrationController de FOSUserBundle crée le formulaire à partir du service fos_user.registration.form.factory

1
2
/** @var $formFactory FactoryInterface */
$formFactory = $this->get('fos_user.registration.form.factory');

Pour résoudre mon problème, j’ai seulement supprimé cette ligne et remplacé la ligne $form = $formFactory->createForm(); par $form = $this->createForm(RegistrationType::class, $user);RegistrationType::class est ma classe de formulaire modifiée, et $user l’utilisateur crée ci-dessus dans la même méthode.

Je n’ai finalement pas besoin de mettre le formulaire en tant que service. Il me reste maintenant à ré-écrire le processus de validation ;)

Édité par Halarp27

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte