web-dev-qa-db-fra.com

Laravel attributs de validation "Noms sympas"

J'essaie d'utiliser les attributs de validation dans "langue> {langue}> validation.php" pour remplacer le nom d'attribut (nom d'entrée) par un nom correct à lire (exemple: prénom_nom> Prénom). Cela semble très simple à utiliser, mais le validateur n'affiche pas les "noms sympas".

J'ai ceci:

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

Pour montrer 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 nom d'attribut soit remplacé par le "joli nom" dans le tableau d'attributs (langue).

Merci!

EDIT:

J'ai remarqué que le problème était que je ne définissais jamais de langue par défaut pour mes projets Laravel. Lorsque je règle la langue sur 'NL', le code ci-dessus fonctionne. Mais, lorsque je définis ma langue, la langue apparaîtra dans l'URL Et je préfère que ce ne soit pas.

Donc, ma question suivante: Est-il possible de supprimer la langue de l'URL ou de définir la langue par défaut afin qu'elle n'apparaisse pas là?

79
Hak

Ouais, les attributs du "joli nom", comme vous l'avez appelé, étaient un véritable "problème" il y a quelques mois. Espérons que cette fonctionnalité est maintenant implémentée et est très simple à utiliser.

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

  1. Global Probablement le plus répandu. Cette approche est très bien expliquée ici mais vous devez éditer le fichier de validation application/language/XX/validation.php, où XX est la langue que vous utiliserez. la validation.

    Au bas, vous verrez un tableau d'attributs; ce sera votre tableau d'attributs "Nom sympa". Suivant votre exemple, le résultat final ressemblera à ceci.

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

    Vous pouvez appeler setAttributeNames sur une instance de Validator maintenant.

    C'est parfaitement valable et si vous vérifiez le code source vous verrez

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

    Ainsi, pour utiliser cette méthode, voir 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 a beaucoup de paquets de langues prêts à partir. Vous devriez certainement y jeter un coup d'œil.

J'espère que cela t'aides.

137
Javier Cadiz

La réponse correcte à ce problème particulier serait d'aller dans votre dossier app/lang et d'éditer 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é créé pour personnaliser spécifiquement ces noms d'attributs.

25
Logus

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 
21
ShirleyCC

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

Un 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) devrait être

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

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

MODIFIER

De plus, je remarque que vous ne transmettez pas un paramètre à $errors->has() alors c'est peut-être le problème.

Pour résoudre ce problème 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 méthode has() la clé "register" (ou celle 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 la conception, mais vous pouvez bien sûr les modifier avec votre propre conception)).

 @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>
8
Altrim

Une réponse tardive mais peut aider quelqu'un

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

et puis par exemple, quand vous avez dans votre modèle

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

Et je ne veux pas comme une erreur please enter a group id

Vous pouvez créer des messages de validation "Nice" en ajoutant le fichier validation.php au tableau personnalisé. 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 vous suffit de modifier (créer) le fichier de validation de langue approprié.

La langue par défaut est stockée dans le fichier de configuration app/config/app.php et est l'anglais par défaut. Cela peut être changé à tout moment en utilisant la méthode App :: setLocale.

Plus d'informations sur les erreurs et les langues peuvent être trouvées ici validation et localisation

2
John Smith

J'utilise mon fichiers de langue personnalisés comme entrée pour le "Noms sympas" comme ceci:

$validator = Validator::make(Input::all(), $rules);
$customLanguageFile = strtolower(class_basename(get_class($this)));

// translate attributes
if(Lang::has($customLanguageFile)) {
    $validator->setAttributeNames($customLanguageFile);
}
1

L'attribut: ne peut utiliser que le nom de l'attribut (prenom dans votre cas), pas les noms sympas.

Mais vous pouvez définir des messages personnalisés pour chaque attribut + validation en définissant des messages comme celui-ci:

$messages = array(
  'first_name_required' => 'Please supply your first name',
  'last_name_required' => 'Please supply your last name',
  'email_required' => 'We need to know your e-mail address!',
  'email_email' => 'Invalid e-mail address!',
);
1
Alexandre Danault

Eh bien, c’est une question assez ancienne, mais je dois vous indiquer que le problème de la langue apparaissant à l’URL peut être résolu en:

  • Changer la langue et fallback_language à config/app.php;
  • ou en définissant\App :: setLocale ($ lang)

Si cela est nécessaire pour persister dans la session, j'utilise actuellement "AppServiceProvider", mais je pense qu'un middleware pourrait être une meilleure approche si le changement de langue par URL est nécessaire.

    if(!Session::has('locale'))
    {
        $locale = MyLocaleService::whatLocaleShouldIUse();
        Session::put('locale', $locale);
    }

    \App::setLocale(Session::get('locale'));

De cette façon, je gère la session et cela ne colle pas à mon URL.

Pour clarifier, j'utilise actuellement Laravel 5.1+ mais ne devrait pas être un comportement différent de 4.x;

0
Victor Moura