95 votes

Attributs de validation Laravel : "noms agréables".

J'essaie d'utiliser les attributs de validation dans "language > {language}". > validation.php", pour remplacer le nom de l'attribut :(nom de l'entrée) par un nom correct à lire (exemple : first_name > Prénom). Cela semble très simple à utiliser, mais le validateur ne montre pas les "beaux noms".

J'ai ça :

'attributes' => array(
    'first_name' => 'voornaam'
  , 'first name' => 'voornaam'
  , 'firstname'  => 'voornaam'
);

Pour avoir montré les erreurs :

@if($errors->has())
  <ul>
  @foreach ($errors->all() as $error)
    <li class="help-inline errorColor">{{ $error }}</li>
  @endforeach
  </ul>
@endif

Et la validation dans le contrôleur :

$validation = Validator::make($input, $rules, $messages);

Le tableau $messages :

$messages = array(
    'required' => ':attribute is verplicht.'
  , 'email'    => ':attribute is geen geldig e-mail adres.'
  , 'min'      => ':attribute moet minimaal :min karakters bevatten.'
  , 'numeric'  => ':attribute mag alleen cijfers bevatten.'
  , 'url'      => ':attribute moet een valide url zijn.'
  , 'unique'   => ':attribute moet uniek zijn.'
  , 'max'      => ':attribute mag maximaal :max zijn.'
  , 'mimes'    => ':attribute moet een :mimes bestand zijn.'
  , 'numeric'  => ':attribute is geen geldig getal.'
  , 'size'     => ':attribute is te groot of bevat te veel karakters.'
);

Quelqu'un peut-il me dire ce que je fais mal ? Je veux que le :attribute name soit remplacé par le "nice name" dans le tableau des attributs (langue).

Merci !

EDIT :

J'ai remarqué que le problème est que je n'ai jamais défini de langue par défaut pour mes projets Laravel. Lorsque je fixe la langue à 'NL', le code ci-dessus fonctionne. Mais, lorsque je définis ma langue, la langue apparaît dans l'url. Et je préfère qu'elle ne le fasse pas.

Donc ma prochaine question : Est-il possible de supprimer la langue de l'url, ou de définir la langue par défaut pour qu'elle n'apparaisse pas ?

157voto

Javier Cadiz Points 2059

Oui, l'attribut "joli nom" comme vous l'avez appelé était un vrai "problème" il y a quelques mois. Espérons que cette fonctionnalité est maintenant mis en œuvre et est très simple à utiliser.

Pour simplifier, je vais séparer les deux options pour résoudre ce problème :

  1. Global Probablement la plus répandue. Cette approche est très bien expliquée aquí mais en gros, vous devez modifier le application/language/XX/validation.php où XX est la langue que vous utiliserez pour la validation.

    En bas, vous verrez un tableau d'attributs ; ce sera votre tableau d'attributs "joli nom". En suivant votre exemple, le résultat final sera quelque chose comme ceci.

    'attributes' => array('first_name' => 'First Name')
  2. Localement C'est ce dont Taylor Otwell parlait dans le cadre du numéro quand il dit :

    Vous pouvez maintenant appeler setAttributeNames sur une instance de validateur.

    C'est tout à fait valide et si vous vérifiez la code source vous verrez

    public function setAttributeNames(array $attributes)
    {
        $this->customAttributes = $attributes;
    
        return $this;
    }

    Pour utiliser cette méthode, voyez l'exemple simple suivant :

    $niceNames = array(
        'first_name' => 'First Name'
    );
    
    $validator = Validator::make(Input::all(), $rules);
    $validator->setAttributeNames($niceNames); 

Ressources

Il y a un repo vraiment génial sur Github qui ont beaucoup de paquets de langues prêts à l'emploi. Vous devriez certainement y jeter un coup d'oeil.

J'espère que cela vous aidera.

43voto

Logus Points 1218

La réponse correcte à ce problème particulier serait d'aller à votre app/lang et modifiez le fichier validation.php au bas du fichier, il y a un tableau appelé attributs :

/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/

'attributes' => array(
    'username' => 'The name of the user',
    'image_id' => 'The related image' // if it's a relation
),

Je pense donc que ce tableau a été construit pour personnaliser spécifiquement ces noms d'attributs.

32voto

ShirleyCC Points 467

Depuis Laravel 5.2, vous pouvez...

public function validForm(\Illuminate\Http\Request $request)
{
    $rules = [
        'first_name' => 'max:130'
    ];  
    $niceNames = [
        'first_name' => 'First Name'
    ]; 
    $this->validate($request, $rules, [], $niceNames);

    // correct validation

8voto

Altrim Points 1664

Dans le tableau "attributes", la clé est le nom de l'entrée et la valeur est la chaîne que vous voulez afficher dans le message.

Par exemple, si vous avez une entrée comme celle-ci

 <input id="first-name" name="first-name" type="text" value="">

Le tableau (dans le fichier validation.php) doit être le suivant

 'attributes' => array(
    'first-name' => 'Voornaam'),

J'ai essayé la même chose et ça marche très bien. J'espère que cela vous aidera.

EDITAR

J'ai aussi remarqué que vous ne passez pas un paramètre à $errors->has() alors peut-être que c'est le problème.

Pour résoudre ce problème, vérifiez dans le contrôleur si vous avez un code comme celui-ci

return Redirect::route('page')->withErrors(array('register' => $validator));

alors vous devez passer à la has() méthode la touche "register" (ou ce que vous utilisez) comme ceci

@if($errors->has('register')
.... //code here
@endif

Une autre façon d'afficher les messages d'erreur est la suivante, que je préfère (j'utilise Twitter Bootstrap pour le design, mais vous pouvez bien sûr les modifier avec votre propre design)

 @if (isset($errors) and count($errors->all()) > 0)
 <div class="alert alert-error">
    <h4 class="alert-heading">Problem!</h4>
     <ul>
        @foreach ($errors->all('<li>:message</li>') as $message)
         {{ $message }}
       @endforeach
    </ul>
</div>

4voto

John Smith Points 717

Dans Laravel 4.1, le moyen le plus simple de le faire est d'aller dans le dossier lang -> votre langue (par défaut en) -> validation.php.

Lorsque vous avez ceci dans votre modèle, par exemple :

'group_id' => 'Integer|required',
'adult_id' => 'Integer|required',

Et si vous ne voulez pas que l'erreur soit "veuillez entrer un identifiant de groupe", vous pouvez créer des messages de validation "agréables" en ajoutant un tableau personnalisé dans validation.php. Ainsi, dans notre exemple, le tableau personnalisé ressemblerait à ceci :

'custom' => array(
    'adult_id' => array(
        'required' => 'Please choose some parents!',
    ),
    'group_id' => array(
        'required' => 'Please choose a group or choose temp!',
    ),
),

Cela fonctionne également avec les applications multilingues, il suffit de modifier (créer) le fichier de validation de la langue correcte.

La langue par défaut est stockée dans le fichier de configuration app/config/app.php, et est l'anglais par défaut. Elle peut être modifiée à tout moment à l'aide de la commande App::setLocale méthode.

Pour plus d'informations sur les erreurs et les langues, cliquez ici. validation y localisation .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X