2013-05-22 1 views
11

Nel FOUserBundle, vorrei poter modificare le impostazioni di convalida per la lunghezza minima, la lunghezza massima e non vuota su campi come nome utente e password.FOSUserBundle - Validazione per nome utente, password o campi di posta elettronica

Sono riuscito a mettere un po 'di convalida tramite @Assert sui miei campi personalizzati, ma ora mi chiedo come posso cambiare la convalida del nome utente per FOSUserBundle?

Questi campi vengono generati automaticamente, quindi non posso aggiungerli all'entità User ... e, per impostazione predefinita, consente caratteri come {^| ecc ... che non sembrano buoni.

risposta

12

È possibile sovrascrivere le impostazioni predefinite creando un nuovo file di convalida nel pacchetto. Questa è l'ereditarietà del pacchetto. Basta copiare (non tagliare).

FOSUserBundle/Resources/config/validation/orm.xml a YourBundle/Resources/config/validation/orm.xml.

(couchdb.xml, mongodb.xml, propel.xml rispettivamente)

e adattarlo alle proprie esigenze. Cambiare il nome della classe, quindi aggiungere i vostri vincoli:

<class name="Vendor\YourBundle\Model\User"> 

    <property name="username"> 
     <!-- minimum length for username --> 
     <constraint name="MinLength"> 
      <option name="limit">3</option> 
      <option name="message">Your name must have at least {{ limit }} characters.</option> 
     </constraint> 
     <!-- custom constraint --> 
     <constraint name="Acme\DemoBundle\Validator\Constraints\ContainsAlphanumeric" /> 
    </property> 

    <constraint name="Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity"> 
     <option name="fields">usernameCanonical</option> 
     <option name="errorPath">username</option> 
     <option name="message">fos_user.username.already_used</option> 
     <option name="groups"> 
      <value>Registration</value> 
      <value>Profile</value> 
     </option> 
    </constraint> 

    <constraint name="Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity"> 
     <option name="fields">emailCanonical</option> 
     <option name="errorPath">email</option> 
     <option name="message">fos_user.email.already_used</option> 
     <option name="groups"> 
      <value>Registration</value> 
      <value>Profile</value> 
     </option> 
    </constraint> 
</class> 

Per saperne di più su quali vincoli sono disponibili (e come usarli con configurazione XML) nella Validation Constraints Reference.

+0

OK, grazie mille! Non avevo nemmeno bisogno di aggiungere il file orm.xml, dopo aver letto correttamente il riferimento dei vincoli di convalida, ho scoperto che potevo semplicemente aggiungere un validation.yml alla configurazione del mio UserBundle e aggiungerlo lì: D –

+0

Questa è la seconda soluzione possibile ma in generale sarai più veloce a utilizzare il file xml di FOSUserBundle con copia e incolla dato che fornisce già uno scheletro :) – nifr

+1

@M. Winterinho potresti aggiungere anche la tua soluzione? –

3

In YML si farebbe in questo modo:

# src/Acme/ProjectBundle/Resources/config/validation.yml 
Acme\ProjectBundle\Entity\User: 
    properties: 
     email: 
      - Length: 
       min: 5 
       minMessage: "Your email must have at least {{ limit }} characters." 
       max: 255 
       maxMessage: "Your email is too long." 
      - NotBlank: 
       message: "Please enter an email" 
     username: 
      - Length: 
       min: 6 
       minMessage: "Your username must have at least {{ limit }} characters." 
       max: 255 
       maxMessage: "Your username is too long." 
      - NotBlank: 
       message: "Please enter an username" 
     plainPassword: 
      - Length: 
       min: 8 
       minMessage: "Your password must have at least {{ limit }} characters." 
       max: 255 
       maxMessage: "Your password is too long." 
      - NotBlank: 
       message: "Please enter a password" 

Acme\ProjectBundle\Form\Model\ChangePassword: 
    properties: 
     new: 
      - Length: 
       min: 8 
       minMessage: "Your password must have at least {{ limit }} characters." 
       max: 255 
       maxMessage: "Your password is too long." 
      - NotBlank: 
       message: "Please enter a password" 

Acme\ProjectBundle\Form\Model\ResetPassword: 
    properties: 
     new: 
      - Length: 
       min: 8 
       minMessage: "Your password must have at least {{ limit }} characters." 
       max: 255 
       maxMessage: "Your password is too long." 
      - NotBlank: 
       message: "Please enter a password" 
+0

nota che hai dimenticato di riaggiungere i vincoli "univoci" –

+0

e il vincolo "email" per email –

4

La cosa più semplice per me è stato quello di sovrascrivere la proprietà della mia entità personalizzata e modificare le impostazioni per l'affermazione:

<?php 
namespace YourBundle\Entity; 

use Symfony\Component\Validator\Constraints as Assert; 

class User extends \FOS\UserBundle\Model\User 
{ 
    // ... 

    /** 
    * @Assert\Length(
    *  min=8, 
    *  max=4096, 
    *  minMessage="user.password.short", 
    *  groups={"Profile", "ResetPassword", "Registration", "ChangePassword"} 
    *) 
    */ 
    protected $plainPassword; 

    // ... 
} 

Don Dimentica i gruppi di convalida.

Testate: user.password.short la traduzione è nello validators Dominio del pacchetto in YourBundle\Resources\translations\.

Esempio:

# validators.en.yml 
user: 
    password: 
     short: Password must be at least 8 characters long. 

Non so se questa è la versione specifica; Sto usando symfony v2.8.3 e fosuser [email protected] (a39d000).