Laravel-Validierungsattribute "nette Namen"

81

Ich versuche, die Validierungsattribute in "Sprache> {Sprache}> Validierung.php" zu verwenden, um den Attributnamen (Eingabename) durch einen richtig lesbaren Namen zu ersetzen (Beispiel: Vorname> Vorname). Es scheint sehr einfach zu bedienen zu sein, aber der Validator zeigt die "netten Namen" nicht an.

Ich habe das:

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

Zum Anzeigen der Fehler:

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

Und die Validierung im Controller:

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

Das Array $ 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.'
);

Kann mir jemand sagen, was ich falsch mache. Ich möchte, dass der Attributname: durch den "netten Namen" im Attributarray (Sprache) ersetzt wird.

Vielen Dank!

BEARBEITEN:

Ich habe festgestellt, dass das Problem darin besteht, dass ich für meine Laravel-Projekte nie eine Standardsprache festgelegt habe. Wenn ich die Sprache auf 'NL' setze, funktioniert der obige Code. Wenn ich jedoch meine Sprache einstelle, wird die Sprache in der URL angezeigt. Und ich bevorzuge es nicht.

Also meine nächste Frage: Ist es möglich, die Sprache aus der URL zu entfernen oder die Standardsprache so einzustellen, dass sie dort einfach nicht angezeigt wird?

Hak
quelle
Ich bin nicht sicher, ob ich es richtig verstehe, aber Sie können die Standardsprache in app / config / app.php festlegen, die vom Übersetzungsdienstleister verwendet wird. Für jede Sprache müssen Sie den entsprechenden Ordner in app / lang / erstellen. Wenn Sie beispielsweise "en" und "nl" als Sprachen haben, die Sie in Ihrer App verwenden, sollten Sie beide Ordner in app / lang / mit den entsprechenden Dateien (in diesem Beispiel validation.php) haben. Wenn Sie also die Sprache ändern, diese Datei wird geladen. Was das Entfernen der Sprache aus der URL betrifft, bin ich mir nicht ganz sicher, aber ich glaube, dass Sie dies mit den Routen erreichen können.
Altrim
Ich weiß, wie man die Sprachen einstellt und die Übersetzung der Eingabenamen funktioniert jetzt. Ich muss nur wissen, wie man die Sprache aus der URL entfernt. Ich werde danach suchen. Vielen Dank!
Hak
Auf jeden Fall kann dies getan werden, siehe meine Antwort unten.
Javier Cadiz
aber es ist für 5.3 stackoverflow.com/a/41904035/1076753
Vixed

Antworten:

142

Yeahh, die "netten Namen" -Attribute, wie Sie sie nannten, waren vor einigen Monaten ein echtes "Problem". Hoffentlich ist diese Funktion jetzt implementiert und sehr einfach zu bedienen.

Der Einfachheit halber werde ich die beiden Optionen aufteilen, um dieses Problem anzugehen:

  1. Global Wahrscheinlich umso weiter verbreitet. Dieser Ansatz wird hier sehr gut erklärt , aber im Grunde müssen Sie die Validierungsdatei application / language / XX / validation.php bearbeiten, wobei XX die Sprache ist, die Sie für die Validierung verwenden werden.

    Unten sehen Sie ein Attributarray. Das wird Ihr Attribut-Array "nice name" sein. Wenn Sie Ihrem Beispiel folgen, wird das Endergebnis ungefähr so ​​aussehen.

    'attributes' => array('first_name' => 'First Name')
    
  2. Vor Ort Dies ist, worüber Taylor Otwell in der Ausgabe sprach , als er sagte:

    Sie können setAttributeNames jetzt auf einer Validator-Instanz aufrufen.

    Das ist vollkommen gültig und wenn Sie den Quellcode überprüfen, werden Sie sehen

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

    Um diesen Weg zu verwenden, sehen Sie sich das folgende einfache Beispiel an:

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

Ressourcen

Es gibt ein wirklich großartiges Repo auf Github , das viele Sprachpakete bereit hält. Auf jeden Fall sollten Sie es überprüfen.

Hoffe das hilft.

Javier Cadiz
quelle
2
Es gibt ein Problem mit der globalen Lösung: In einer Form könnte ich haben 'name' => 'Customer name'und in einer anderen Form könnte es sein 'name'=>'Seller name'. Ich bevorzuge meine Übersetzungen pro Modul, damit ich diese Werte auch als Beschriftungen für Formularfelder wiederverwenden kann. Daher stimme ich für eine lokale Lösung, aber wie rufe ich dann das Array $ niceNames aus meiner Sprachdatei ab? Und wie rufe ich auf, setAttributeNamesohne eine neue Validator-Instanz zu erstellen, aber die in Controllern verfügbare Methode $ this-> validate () zu verwenden?
JustAMartin
2
Als Antwort auf diesen Kommentar und um die Lösung von @javiercadiz zu vervollständigen, können Sie seit Laravel 5.1 einen vierten Parameter verwenden $this->validate(Request $request, $rules, $messages, $customAttributes), um diese schönen Namen zu erhalten. Sehen Sie es in Laravel 5.1 API - Validate Request
Fran Arjona
Wo setzen Sie den Code in die letzte Option? Ich meine diesen Teil: $validator = Validator::make(Input::all(), $rules); $validator->setAttributeNames($niceNames);
Jenthe
Wenn Sie die "lokale" Lösung verwenden, können Sie die Attributnamen übrigens aus einer Sprachdatei wie folgt laden : $validator->setAttributeNames(Lang::get('my-language-file')).
oder
31

Die richtige Antwort auf dieses spezielle Problem wäre, in Ihren Ordner app / lang zu gehen und die Datei validation.php am Ende der Datei zu bearbeiten. Dort befindet sich ein Array namens Attribute :

/*
|--------------------------------------------------------------------------
| 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
),

Daher glaube ich, dass dieses Array speziell für die Anpassung dieser Attributnamen erstellt wurde.

Logus
quelle
3
Dies ist die beste Antwort, um Antworten auf Spanisch zu geben 'attributes' => [ 'name' => 'nombre', 'mail' => 'correo', 'password' => 'contraseña', 'password2' => 'confirmación de contraseña', ],
1
Arbeitet in Laravel 5.6
Yevgeniy Afanasyev
25

Seit Laravel 5.2 konnte man ...

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

    // correct validation 
ShirleyCC
quelle
8

Im Array "Attribute" ist der Schlüssel der Eingabename und der Wert die Zeichenfolge, die Sie in der Nachricht anzeigen möchten.

Ein Beispiel, wenn Sie eine Eingabe wie diese haben

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

Das Array (in der Datei validation.php) sollte sein

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

Ich habe das Gleiche versucht und es funktioniert großartig. Hoffe das hilft.

BEARBEITEN

Außerdem fällt mir auf, dass Sie keinen Parameter übergeben. $errors->has()Vielleicht ist das das Problem.

Um dies zu beheben, überprüfen Sie im Controller, ob Sie einen solchen Code haben

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

dann müssen Sie has()den "Register" -Schlüssel (oder was auch immer Sie verwenden) wie folgt an die Methode übergeben

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

Eine andere Möglichkeit, Fehlermeldungen anzuzeigen, ist die folgende, die ich bevorzuge (ich verwende Twitter Bootstrap für das Design, aber natürlich können Sie diese mit Ihrem eigenen Design ändern).

 @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>
Altrim
quelle
1
Was ist, wenn der Feldname ein Array ist? Zum Beispiel <input type="text" name="txt[]" />". Der Fehler gibt so etwas wie aus The txt.0 is required.. Wie kann man es durch nette Namen ersetzen?
Anna Fortuna
@AnnaFortuna Überprüfen Sie diesen Beitrag, um zu sehen, ob es Ihnen helfen könnte stackoverflow.com/questions/17974231/…
Altrim
Danke @Altrim, ich werde es überprüfen.
Anna Fortuna
2

Ich verwende meine benutzerdefinierten Sprachdateien als Eingabe für die "netten Namen" wie folgt:

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

// translate attributes
if(Lang::has($customLanguageFile)) {
    $validator->setAttributeNames($customLanguageFile);
}
Jan Schwingneschlögl
quelle
2

In Laravel 4.1 gehen Sie dazu einfach in den Ordner lang -> Ihre Sprache (Standard en) -> validation.php.

Wenn Sie dies in Ihrem Modell haben, zum Beispiel:

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

Und Sie möchten nicht, dass der Fehler "Bitte geben Sie eine Gruppen-ID ein" lautet. Sie können "nette" Validierungsnachrichten erstellen, indem Sie ein benutzerdefiniertes Array in validation.php hinzufügen. In unserem Beispiel würde das benutzerdefinierte Array folgendermaßen aussehen:

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

Dies funktioniert auch mit mehrsprachigen Apps. Sie müssen lediglich die richtige Sprachüberprüfungsdatei bearbeiten (erstellen).

Die Standardsprache wird in der Konfigurationsdatei app / config / app.php gespeichert und ist standardmäßig Englisch. Dies kann jederzeit mit der App::setLocaleMethode geändert werden.

Weitere Informationen zu Fehlern und Sprachen finden Sie hier zur Validierung und Lokalisierung .

John Smith
quelle
1

Das Attribut: kann nur den Attributnamen (in Ihrem Fall Vorname) verwenden, keine netten Namen.

Sie können jedoch benutzerdefinierte Nachrichten für jedes Attribut + Validierung definieren, indem Sie Nachrichten wie folgt definieren:

$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!',
);
Alexandre Danault
quelle
1

In Laravel 7.

use Illuminate\Support\Facades\Validator;

Dann definieren Sie niceNames

$niceNames = array(
   'name' => 'Name',
);

Und das letzte, setzen Sie einfach $ niceNames in den vierten Parameter, wie folgt:

$validator = Validator::make($request->all(), $rules, $messages, $niceNames);
Wahyu Kodar
quelle
0

Nun, es ist eine ziemlich alte Frage, aber ich möchte nur darauf hinweisen, dass das Problem, dass die Sprache unter der URL angezeigt wird, gelöst werden kann durch:

  • Ändern der Sprache und der Fallback-Sprache unter config/app.php;
  • oder durch Setzen von \ App :: setLocale ($ lang)

Wenn dies erforderlich ist, um die Sitzung aufrechtzuerhalten, verwende ich derzeit den "AppServiceProvider", um dies zu tun. Ich denke jedoch, dass eine Middleware ein besserer Ansatz ist, wenn die Sprache nach URL geändert werden muss. Daher gefällt mir dies bei meinem Anbieter:

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

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

Auf diese Weise behandle ich die Sitzung und sie bleibt nicht bei meiner URL.

Zur Verdeutlichung verwende ich derzeit Laravel 5.1+, sollte aber nicht anders als 4.x sein.

Victor Moura
quelle
0
$customAttributes = [
'email' => 'email address',
];

$validator = Validator::make($input, $rules, $messages, $customAttributes);
Talha Masood
quelle
5
Dieser Code bietet möglicherweise eine Lösung für das Problem. Es wird jedoch dringend empfohlen, einen zusätzlichen Kontext anzugeben, in dem erläutert wird, warum und / oder wie dieser Code die Frage beantwortet. Nur-Code-Antworten werden auf lange Sicht normalerweise unbrauchbar, da zukünftige Betrachter mit ähnlichen Problemen die Gründe für die Lösung nicht verstehen können.
E. Zeytinci