Atrybuty walidacji Laravel „ładne nazwy”

82

Próbuję użyć atrybutów walidacji w „język> {język}> validation.php”, aby zamienić: nazwa atrybutu (nazwa wejściowa) na właściwą do odczytania nazwę (przykład: imię> Imię). Wydaje się, że jest bardzo prosty w użyciu, ale walidator nie pokazuje „ładnych nazw”.

Mam to:

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

Aby pokazać błędy:

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

Oraz walidacja w kontrolerze:

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

Tablica $ wiadomości:

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

Czy ktoś może mi powiedzieć, co robię źle. Chcę, aby: nazwa atrybutu została zastąpiona przez „ładną nazwę” w tablicy atrybutów (język).

Dzięki!

EDYTOWAĆ:

Zauważyłem, że problem polega na tym, że nigdy nie ustawiłem domyślnego języka dla moich projektów Laravel. Kiedy ustawię język na „NL”, powyższy kod działa. Ale kiedy ustawię język, język pojawi się w adresie URL. I wolę, żeby tak nie było.

Więc moje następne pytanie: czy można usunąć język z adresu URL lub ustawić język domyślny, aby po prostu się tam nie pojawiał?

Hak
źródło
Nie jestem pewien, czy dobrze to rozumiem, ale możesz ustawić domyślny język w app / config / app.php, który będzie używany przez dostawcę usług tłumaczeniowych. Dla każdego języka musisz utworzyć odpowiedni folder w app / lang /. np. jeśli masz „en” i „nl” jako języki, których używasz w swojej aplikacji, powinieneś mieć oba foldery w app / lang / z odpowiednimi plikami (w tym przykładzie validation.php), więc za każdym razem, gdy zmienisz język, ten plik zostanie załadowany. Co do usunięcia języka z url, nie jestem do końca pewien, ale uważam, że można to osiągnąć dzięki trasom.
Altrim,
Wiem, jak ustawić języki, a tłumaczenie nazw wejściowych działa teraz. Muszę tylko wiedzieć, jak usunąć język z adresu URL. Poszukam tego. Dzięki!
Hak,
Zdecydowanie można to zrobić, zobacz moją odpowiedź poniżej.
Javier Cadiz

Odpowiedzi:

143

Tak, atrybuty „fajna nazwa”, jak je nazwałeś, były prawdziwym „problemem” kilka miesięcy temu. Mam nadzieję, że ta funkcja została już zaimplementowana i jest bardzo prosta w użyciu.

Dla uproszczenia podzielę dwie opcje rozwiązania tego problemu:

  1. Globalny Prawdopodobnie bardziej rozpowszechniony. To podejście jest tutaj bardzo dobrze wyjaśnione , ale zasadniczo musisz edytować plik walidacyjny application / language / XX / validation.php, gdzie XX jest językiem, którego będziesz używać do walidacji.

    Na dole zobaczysz tablicę atrybutów; to będzie tablica atrybutów „ładne imię”. Idąc za twoim przykładem, ostateczny wynik będzie mniej więcej taki.

    'attributes' => array('first_name' => 'First Name')
    
  2. Lokalnie O tym mówił Taylor Otwell w numerze , mówiąc:

    Możesz teraz wywołać setAttributeNames na instancji Validator.

    Jest to całkowicie poprawne i jeśli zaznaczysz kod źródłowy , zobaczysz

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

    Aby skorzystać z tego sposobu, zobacz następujący prosty przykład:

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

Zasoby

Na Github jest naprawdę świetne repozytorium, które ma wiele gotowych pakietów językowych. Zdecydowanie powinieneś to sprawdzić.

Mam nadzieję że to pomoże.

Javier Cadiz
źródło
2
Jest problem z rozwiązaniem globalnym: w jednej formie mógłbym mieć, 'name' => 'Customer name'aw innej może być 'name'=>'Seller name'. Wolę mieć tłumaczenia na moduł, więc mogę ponownie użyć tych wartości również jako etykiet dla pól formularzy. Dlatego głosuję za rozwiązaniem lokalnym, ale w takim razie jak mogę odzyskać tablicę $ niceNames z mojego pliku językowego? Jak mam wywołać setAttributeNamesbez tworzenia nowej instancji Validatora, ale używając metody $ this-> validate (), która jest dostępna w kontrolerach?
JustAMartin
2
W odpowiedzi na ten komentarz i aby ukończyć rozwiązanie @javiercadiz, od Laravel 5.1 możesz użyć czwartego parametru in, $this->validate(Request $request, $rules, $messages, $customAttributes)aby mieć te ładne nazwy. Zobacz to w Laravel 5.1 API - Validate Request
Fran Arjona
Gdzie umieszczasz kod w ostatniej opcji? Mam na myśli tę część: $validator = Validator::make(Input::all(), $rules); $validator->setAttributeNames($niceNames);
Jenthe
Nawiasem mówiąc, jeśli używasz rozwiązanie „lokalnie”, można załadować nazwy atrybutów z pliku językowego tak: $validator->setAttributeNames(Lang::get('my-language-file')).
lub
31

Prawidłową odpowiedzią na ten konkretny problem byłoby przejście do folderu app / lang i edycja pliku validation.php , w dolnej części pliku znajduje się tablica o nazwie atrybuty :

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

Dlatego uważam, że ta tablica została zbudowana w celu dostosowania nazw atrybutów.

Logus
źródło
3
To najlepsza odpowiedź, aby odpowiedzieć po hiszpańsku 'attributes' => [ 'name' => 'nombre', 'mail' => 'correo', 'password' => 'contraseña', 'password2' => 'confirmación de contraseña', ],
1
Działa w Laravel 5.6
Yevgeniy Afanasyev
27

Od Laravel 5.2 możesz ...

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
źródło
8

W tablicy „atrybutów” klucz jest nazwą wejściową, a wartością jest ciąg znaków, który ma zostać wyświetlony w komunikacie.

Przykład, jeśli masz takie dane wejściowe

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

Tablica (w pliku validation.php) powinna być

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

Próbowałem tego samego i działa świetnie. Mam nadzieję że to pomoże.

EDYTOWAĆ

Zauważyłem również, że nie przekazujesz parametru, $errors->has()więc może to jest problem.

Aby to naprawić, sprawdź w kontrolerze, jeśli masz taki kod

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

wtedy musisz przekazać do has()metody klucz "register" (lub cokolwiek, czego używasz) w ten sposób

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

Innym sposobem wyświetlania komunikatów o błędach jest następujący, który preferuję (do projektowania używam Twitter Bootstrap, ale oczywiście możesz je zmienić za pomocą własnego projektu)

 @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
źródło
1
A jeśli nazwa pola to tablica? Na przykład <input type="text" name="txt[]" />". Błąd wyświetli coś takiego The txt.0 is required.. Jak możesz to zastąpić ładnymi nazwami?
Anna Fortuna
@AnnaFortuna Sprawdź ten post i zobacz, czy może ci on pomóc stackoverflow.com/questions/17974231/ ...
Altrim
Dzięki @Altrim, sprawdzę to.
Anna Fortuna
4

W Laravel 4.1 prostym sposobem na to jest przejście do folderu lang -> twój język (domyślnie en) -> validation.php.

Kiedy masz to w swoim modelu, na przykład:

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

I nie chcesz, aby błąd brzmiał „proszę podać identyfikator grupy”, możesz utworzyć „ładne” komunikaty walidacyjne, dodając niestandardową tablicę w pliku validation.php. W naszym przykładzie tablica niestandardowa wyglądałaby następująco:

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

Działa to również z aplikacjami wielojęzycznymi, wystarczy edytować (utworzyć) odpowiedni plik walidacji języka.

Domyślny język jest przechowywany w pliku konfiguracyjnym app / config / app.php i domyślnie jest to angielski. Można to zmienić w dowolnym momencie za pomocą App::setLocalemetody.

Więcej informacji na temat błędów i języków można znaleźć tutaj: walidacja i lokalizacja .

John Smith
źródło
2

Używam moich niestandardowych plików językowych jako danych wejściowych dla „ładnych nazw” w następujący sposób:

$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
źródło
2

W Laravel 7.

use Illuminate\Support\Facades\Validator;

Następnie zdefiniuj niceNames

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

I na koniec, po prostu umieść $ niceNames w czwartym parametrze, na przykład:

$validator = Validator::make($request->all(), $rules, $messages, $niceNames);
Wahyu Kodar
źródło
1

The: attribute może używać tylko nazwy atrybutu (w twoim przypadku imię_imienia), a nie ładnych nazw.

Ale możesz zdefiniować niestandardowe komunikaty dla każdego atrybutu + walidacja, definiując komunikaty w ten sposób:

$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
źródło
1
$customAttributes = [
'email' => 'email address',
];

$validator = Validator::make($input, $rules, $messages, $customAttributes);
Talha Masood
źródło
6
Chociaż ten kod może stanowić rozwiązanie problemu, zdecydowanie zaleca się podanie dodatkowego kontekstu wyjaśniającego, dlaczego i / lub jak ten kod odpowiada na pytanie. Odpowiedzi zawierające tylko kod zazwyczaj stają się bezużyteczne na dłuższą metę, ponieważ przyszli widzowie doświadczający podobnych problemów nie mogą zrozumieć przyczyny rozwiązania.
E. Zeytinci
0

Cóż, to dość stare pytanie, ale mało kto powinienem wskazać, że problem z językiem występującym pod adresem URL można rozwiązać przez:

  • Zmiana języka i fallback_language na config/app.php;
  • lub ustawiając \ App :: setLocale ($ lang)

Jeśli zachodzi potrzeba, aby utrzymać go w sesji, obecnie używam do tego „AppServiceProvider”, ale myślę, że oprogramowanie pośredniczące może być lepszym podejściem, jeśli konieczna jest zmiana języka według adresu URL, więc robię to u mojego dostawcy:

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

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

W ten sposób radzę sobie z sesją i nie przykleja się do mojego adresu URL.

Aby wyjaśnić, obecnie używam Laravel 5.1+, ale nie powinno to być inne zachowanie niż 4.x;

Victor Moura
źródło