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ł?


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.


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.


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 

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>

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 .


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);
}

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);

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!',
);

1
$customAttributes = [
'email' => 'email address',
];

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

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;

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.