Supprimer / Remplacer le champ nom d'utilisateur par e-mail à l'aide FOSUserBundle dans Symfony2 / Symfony3

StackOverflow https://stackoverflow.com/questions/8832916

  •  27-10-2019
  •  | 
  •  

Question

Je veux seulement avoir e-mail que le mode de connexion, je ne veux pas avoir le nom d'utilisateur. Est-il possible avec Symfony2 / symfony3 et FOSUserbundle?

Je lis ici http://groups.google.com/group/symfony2 / browse_thread / fil / 92ac92eb18b423fe

Mais alors je suis coincé avec deux violations de contrainte.

Le problème est que si l'utilisateur quitte le blanc l'adresse e-mail, je reçois deux contraintes violations:

  • S'il vous plaît entrer un nom d'utilisateur
  • S'il vous plaît entrer un e-mail

Y at-il un moyen de désactiver la validation pour un champ donné, ou une meilleure façon de supprimer un champ de la forme tout à fait?

Était-ce utile?

La solution

Un aperçu complet de ce qui doit être fait

Voici un aperçu complet de ce qui doit être fait. J'ai énuméré les différentes sources trouvées ici et là à la fin de ce post.

1. Remplacer setter dans Acme\UserBundle\Entity\User

public function setEmail($email)
{
    $email = is_null($email) ? '' : $email;
    parent::setEmail($email);
    $this->setUsername($email);

    return $this;
}

2. Retirez le champ Nom d'utilisateur de votre type de formulaire

(dans les deux RegistrationFormType et ProfileFormType)

public function buildForm(FormBuilder $builder, array $options)
{
    parent::buildForm($builder, $options);
    $builder->remove('username');  // we use email as the username
    //..
}

3. contraintes de validation

Comme le montre @nurikabe, nous devons nous débarrasser des contraintes de validation fournies par FOSUserBundle et créer notre propre. Cela signifie que nous devrons recréer toutes les contraintes qui ont déjà été créées dans FOSUserBundle et de supprimer ceux qui concernent le champ de username. Les nouveaux groupes de validation que nous allons créer sont AcmeRegistration et AcmeProfile. Nous sommes donc complètement outrepasser ceux fournis par le FOSUserBundle.

3.a. Mise à jour le fichier de configuration dans Acme\UserBundle\Resources\config\config.yml

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: Acme\UserBundle\Entity\User
    registration:
        form:
            type: acme_user_registration
            validation_groups: [AcmeRegistration]
    profile:
        form:
            type: acme_user_profile
            validation_groups: [AcmeProfile]

3.b. Créer un fichier de validation Acme\UserBundle\Resources\config\validation.yml

C'est long bit:

Acme\UserBundle\Entity\User:
    properties:
    # Your custom fields in your user entity, here is an example with FirstName
        firstName:
            - NotBlank:
                message: acme_user.first_name.blank
                groups: [ "AcmeProfile" ]
            - Length:
                min: 2
                minMessage: acme_user.first_name.short
                max: 255
                maxMessage: acme_user.first_name.long
                groups: [ "AcmeProfile" ]



# Note: We still want to validate the email
# See FOSUserBundle/Resources/config/validation/orm.xml to understand
# the UniqueEntity constraint that was originally applied to both
# username and email fields
#
# As you can see, we are only applying the UniqueEntity constraint to 
# the email field and not the username field.
FOS\UserBundle\Model\User:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: 
             fields: email
             errorPath: email 
             message: fos_user.email.already_used
             groups: [ "AcmeRegistration", "AcmeProfile" ]

    properties:
        email:
            - NotBlank:
                message: fos_user.email.blank
                groups: [ "AcmeRegistration", "AcmeProfile" ]
            - Length:
                min: 2
                minMessage: fos_user.email.short
                max: 255
                maxMessage: fos_user.email.long
                groups: [ "AcmeRegistration", "ResetPassword" ]
            - Email:
                message: fos_user.email.invalid
                groups: [ "AcmeRegistration", "AcmeProfile" ]
        plainPassword:
            - NotBlank:
                message: fos_user.password.blank
                groups: [ "AcmeRegistration", "ResetPassword", "ChangePassword" ]
            - Length:
                min: 2
                max: 4096
                minMessage: fos_user.password.short
                groups: [ "AcmeRegistration", "AcmeProfile", "ResetPassword", "ChangePassword"]

FOS\UserBundle\Model\Group:
    properties:
        name:
            - NotBlank:
                message: fos_user.group.blank
                groups: [ "AcmeRegistration" ]
            - Length:
                min: 2
                minMessage: fos_user.group.short
                max: 255
                maxMessage: fos_user.group.long
                groups: [ "AcmeRegistration" ]

FOS\UserBundle\Propel\User:
    properties:
        email:
            - NotBlank:
                message: fos_user.email.blank
                groups: [ "AcmeRegistration", "AcmeProfile" ]
            - Length:
                min: 2
                minMessage: fos_user.email.short
                max: 255
                maxMessage: fos_user.email.long
                groups: [ "AcmeRegistration", "ResetPassword" ]
            - Email:
                message: fos_user.email.invalid
                groups: [ "AcmeRegistration", "AcmeProfile" ]

        plainPassword:
            - NotBlank:
                message: fos_user.password.blank
                groups: [ "AcmeRegistration", "ResetPassword", "ChangePassword" ]
            - Length:
                min: 2
                max: 4096
                minMessage: fos_user.password.short
                groups: [ "AcmeRegistration", "AcmeProfile", "ResetPassword", "ChangePassword"]


FOS\UserBundle\Propel\Group:
    properties:
        name:
            - NotBlank:
                message: fos_user.group.blank
                groups: [ "AcmeRegistration" ]
            - Length:
                min: 2
                minMessage: fos_user.group.short
                max: 255
                maxMessage: fos_user.group.long
                groups: [ "AcmeRegistration" ]

4. Fin

Ca y est! Vous devriez être bon d'aller!


Documents utilisés pour ce poste:

Autres conseils

j'ai pu le faire en remplaçant à la fois l'inscription et le formulaire de profil détaillé de type ici et retirer le champ Nom d'utilisateur

$builder->remove('username');

En plus redéfinissant la méthode setEmail dans ma classe utilisateur concret:

 public function setEmail($email) 
 {
    $email = is_null($email) ? '' : $email;
    parent::setEmail($email);
    $this->setUsername($email);
  }

Comme Michael souligne, cela peut être résolu avec un groupe de validation personnalisée. Par exemple:

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: App\UserBundle\Entity\User
    registration:
        form:
            type: app_user_registration
            validation_groups: [AppRegistration]

Ensuite, dans votre entité (tel que défini par user_class: App\UserBundle\Entity\User), vous pouvez utiliser le groupe AppRegistration:

class User extends BaseUser {

    /**
     * Override $email so that we can apply custom validation.
     * 
     * @Assert\NotBlank(groups={"AppRegistration"})
     * @Assert\MaxLength(limit="255", message="Please abbreviate.", groups={"AppRegistration"})
     * @Assert\Email(groups={"AppRegistration"})
     */
    protected $email;
    ...

est ce que je fini par faire après avoir publié cette réponse au fil Symfony2.

Voir http://symfony.com/doc/2.0/book /validation.html#validation-groups pour plus de détails.

de Sf 2.3, solution rapide est de définir le nom d'utilisateur pour une chaîne dans la _construct de votre classe utilisateur qui va BaseUser.

public function __construct()
    {
        parent::__construct();
        $this->username = 'username';
    }

De cette façon, le validateur wont déclenche toute violation. Mais ne pas oublier de mettre l'e-mail au nom d'utilisateur tel que publié par Patt .

public function setEmail($email)
{
    $email = is_null($email) ? '' : $email;
    parent::setEmail($email);
    $this->setUsername($email);
}

Vous pouvez avoir à vérifier d'autres fichiers pour les références à l'utilisateur:. Nom d'utilisateur et le changement en conséquence

Avez-vous essayé de personnaliser la validation?

Pour ce faire, vous devez avoir votre propre paquet héritant de la UserBundle, puis copier / modifier Ressources / config / validation.xml. De plus, vous devez définir les validation_groups dans le config.yml à la validation de votre commande.

Au lieu de remplacer Validation je préfère remplacer processus RegistrationFormHandler de #, plus précisément d'ajouter une nouvelle méthode processExtended (par exemple), qui est une copie de la méthode originale et utiliser ut dans RegistrationController. (Redéfinition: https://github.com/ FriendsOfSymfony / FOSUserBundle / blob / master / Ressources / doc / index.md # next-steps )

i Avant de se lier à enregistrer le nom d'utilisateur i forment ensemble, par exemple 'vide':

class RegistrationFormHandler extends BaseHandler
{

    public function processExtended($confirmation = false)
    {
        $user = $this->userManager->createUser();
        $user->setUsername('empty'); //That's it!!
        $this->form->setData($user);

        if ('POST' == $this->request->getMethod()) {


            $this->form->bindRequest($this->request);

            if ($this->form->isValid()) {

                $user->setUsername($user->getEmail()); //set email as username!!!!!
                $this->onSuccess($user, $confirmation);

                /* some my own logic*/

                $this->userManager->updateUser($user);
                return true;
            }
        }

        return false;
    }
    // replace other functions if you want
}

Pourquoi? Je préfère les règles de validation de FOSUserBundle utilisateur. Cuz si je remplacerai groupe de validation dans config.yml formulaire d'inscription que je dois répéter les règles de validation pour l'utilisateur dans ma propre entité utilisateur.

Si aucun d'entre eux fonctionne, une solution rapide et sale serait

public function setEmail($email)
{
    $email = is_null($email) ? '' : $email;
    parent::setEmail($email);
    $this->setUsername(uniqid()); // We do not care about the username

    return $this;
}

Vous pouvez faire le nullable nom d'utilisateur, puis retirez-le du type de formulaire:

Première , AppBundle \ Entité \ User , ajoutez l'annotation ci-dessus la classe utilisateur

use Doctrine\ORM\Mapping\AttributeOverrides;
use Doctrine\ORM\Mapping\AttributeOverride;

/**
 * User
 *
 * @ORM\Table(name="fos_user")
 *  @AttributeOverrides({
 *     @AttributeOverride(name="username",
 *         column=@ORM\Column(
 *             name="username",
 *             type="string",
 *             length=255,
 *             unique=false,
 *             nullable=true
 *         )
 *     ),
 *     @AttributeOverride(name="usernameCanonical",
 *         column=@ORM\Column(
 *             name="usernameCanonical",
 *             type="string",
 *             length=255,
 *             unique=false,
 *             nullable=true
 *         )
 *     )
 * })
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 */
class User extends BaseUser
{
//..

Lorsque vous exécutez php bin/console doctrine:schema:update --force il fera le nullable nom d'utilisateur dans la base de données.

Deuxième , dans votre type de formulaire AppBundle \ Form \ RegistrationType , retirez le nom d'utilisateur du formulaire.

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->remove('username');
        // you can add other fields with ->add('field_name')
    }

Maintenant, vous ne verrez pas le champ nom d'utilisateur sous la forme (grâce à $builder->remove('username');). et lorsque vous soumettez le formulaire, vous ne recevrez pas l'erreur de validation « S'il vous plaît entrer un nom d'utilisateur » plus parce qu'il est plus nécessaire (grâce à l'annotation).

Source: https://github.com/FriendsOfSymfony/FOSUserBundle/issues / 982 # issuecomment-12931663

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top