Laravel doğrulama nitelikleri "güzel isimler"


82

Okunacak uygun bir ad için: öznitelik adını (giriş adı) değiştirmek için "dil> {dil}> validation.php" içindeki doğrulama özniteliklerini kullanmaya çalışıyorum (örnek: ad_ad> Ad). Kullanımı çok basit görünüyor, ancak doğrulayıcı "güzel isimler" göstermiyor.

Bu bende var:

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

Hataları göstermek için:

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

Ve denetleyicideki doğrulama:

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

$ Mesaj dizisi:

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

Biri bana neyi yanlış yaptığımı söyleyebilir mi? Öznitelik adının öznitelikler dizisindeki (dil) "güzel ad" ile değiştirilmesini istiyorum.

Teşekkürler!

DÜZENLE:

Sorunun Laravel projelerim için asla varsayılan bir dil belirlememem olduğunu fark ettim. Dili 'NL' olarak ayarladığımda yukarıdaki kod çalışıyor. Ancak, dilimi ayarladığımda, dil url'de görünecek. Ve olmamasını tercih ederim.

Öyleyse bir sonraki sorum: Dili url'den kaldırmak veya varsayılan dili orada görünmeyecek şekilde ayarlamak mümkün mü?


Doğru anladığımdan emin değilim, ancak varsayılan dili app / config / app.php'de çeviri hizmeti sağlayıcısı tarafından kullanılacak şekilde ayarlayabilirsiniz. Her dil için app / lang / içinde ilgili klasörü oluşturmanız gerekir. Örneğin, uygulamanızda kullandığınız diller olarak "en" ve "nl" varsa, ilgili dosyalarla (bu örnekte validation.php) her iki klasöre de sahip olmalısınız. yüklenecek. Dilin url'den kaldırılmasına gelince, tam olarak emin değilim, ancak bunu rotalarla başarabileceğinize inanıyorum.
Altrim

Dilleri nasıl ayarlayacağımı biliyorum ve giriş adlarını çevirmek artık çalışıyor. Sadece dili url'den nasıl kaldıracağımı bilmem gerekiyor. Bunu arayacağım. Teşekkürler!
Hak

Kesinlikle bu yapılabilir, aşağıdaki cevabıma bakın.
Javier Cadiz

Yanıtlar:


143

Evet, senin dediğin "güzel isim" özellikleri, birkaç ay önce gerçek bir "sorun" idi. Umarım bu özellik artık uygulanmıştır ve kullanımı çok basittir.

Basit olması için, bu sorunu çözmek için iki seçeneği ayıracağım:

  1. Küresel Muhtemelen daha yaygın. Bu yaklaşım çok iyi açıklanmıştır burada ancak temelde düzenlemek için gereken uygulama / dil / XX / validation.php XX doğrulama için kullanacağı bir dildir doğrulama dosyasını.

    Altta bir öznitelik dizisi göreceksiniz; bu sizin "güzel ad" öznitelik diziniz olacaktır. Örneğinizin ardından nihai sonuç şuna benzer bir şey olacaktır.

    'attributes' => array('first_name' => 'First Name')
    
  2. Yerel olarak Taylor Otwell'in konuyla ilgili söylediği şey budur:

    Şimdi bir Validator örneğinde setAttributeNames çağırabilirsiniz.

    Bu tamamen geçerli ve kaynak kodunu kontrol ederseniz göreceksiniz

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

    Dolayısıyla, bu şekilde kullanmak için aşağıdaki basit örneğe bakın:

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

Kaynaklar

Github'da kullanıma hazır birçok dil paketine sahip gerçekten harika bir repo var. Kesinlikle kontrol etmelisiniz.

Bu yardımcı olur umarım.


2
Küresel çözümle ilgili bir sorun var: bir biçimde sahip olabilirim 'name' => 'Customer name've başka bir biçimde olabilir 'name'=>'Seller name'. Çevirilerimin modül başına olmasını tercih ederim, böylece bu değerleri form alanları için etiketler olarak da yeniden kullanabilirim. Bu nedenle, yerel çözüme oy veriyorum, ancak o zaman bu $ niceNames dizisini dil dosyamdan nasıl alırım? Ve setAttributeNamesyeni bir Validator örneği oluşturmadan, ancak denetleyicilerde bulunan $ this-> validate () yöntemini kullanarak nasıl çağırırım ?
JustAMartin

2
Bu yoruma yanıt olarak ve @javiercadiz çözümünü tamamlamak için, Laravel 5.1'den beri $this->validate(Request $request, $rules, $messages, $customAttributes)bu güzel isimlere sahip olmak için dördüncü bir parametre kullanabilirsiniz . Bunu Laravel 5.1 API'sinde görün - Talebi Doğrulama
Fran Arjona

Son seçenekte kodu nereye koyuyorsunuz? Bu kısmı kastediyorum: $validator = Validator::make(Input::all(), $rules); $validator->setAttributeNames($niceNames);
Jenthe

Eğer "yerel" çözümü kullanıyorsanız, bu arada, böyle bir dil dosyasından özellik adlarını yükleyebilir: $validator->setAttributeNames(Lang::get('my-language-file')).
2016

31

Bu özel sorunun doğru cevabı, app / lang klasörünüze gitmek ve dosyanın en altındaki validation.php dosyasını düzenlemek, öznitelikler adı verilen bir dizi olacaktır :

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

Bu yüzden bu dizinin özellikle bu öznitelik adlarını özelleştirmek için yapıldığına inanıyorum.


3
Bu, ispanyolca yanıt vermek için en iyi cevaptır 'attributes' => [ 'name' => 'nombre', 'mail' => 'correo', 'password' => 'contraseña', 'password2' => 'confirmación de contraseña', ],

1
Laravel 5.6'da çalışıyor
Yevgeniy Afanasyev

27

Laravel 5.2'den bu yana ...

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

"Öznitelikler" dizisinde anahtar, giriş adıdır ve değer, mesajda göstermek istediğiniz dizedir.

Böyle bir girdiniz varsa bir örnek

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

Dizi (validation.php dosyasında) olmalıdır

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

Ben de aynı şeyi denedim ve harika çalışıyor. Bu yardımcı olur umarım.

DÜZENLE

Ayrıca, bir parametreye geçmediğinizi fark ediyorum, $errors->has()bu yüzden belki de sorun budur.

Böyle bir kodunuz varsa, kontrol cihazında bu kontrolü düzeltmek için

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

daha sonra has()yönteme bu şekilde "kayıt" anahtarını (veya her ne kullanıyorsanız) iletmelisiniz.

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

Hata mesajlarını görüntülemenin başka bir yolu da tercih ettiğim şudur (Tasarım için Twitter Bootstrap kullanıyorum ama tabii ki bunları kendi tasarımınızla değiştirebilirsiniz)

 @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
Ya alan adı bir diziyse? Örneğin <input type="text" name="txt[]" />",. Hata gibi bir şey çıktı The txt.0 is required.. Onu güzel isimlerle nasıl değiştirebilirsin?
Anna Fortuna

@AnnaFortuna Bu gönderiyi kontrol et, stackoverflow.com/questions/17974231/…
Altrim

Teşekkürler @ Altrim, kontrol edeceğim.
Anna Fortuna

4

Laravel 4.1'de bunu yapmanın kolay yolu lang klasörüne -> diliniz (varsayılan en) -> validation.php'ye gitmektir.

Modelinizde buna sahip olduğunuzda, örneğin:

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

Ve hatanın "lütfen bir grup kimliği girin" olmasını istemiyorsanız, validation.php'ye özel bir dizi ekleyerek "güzel" doğrulama mesajları oluşturabilirsiniz. Örneğimizde, özel dizi şöyle görünecektir:

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

Bu aynı zamanda çok dilli uygulamalarla da çalışır, sadece doğru dil doğrulama dosyasını düzenlemeniz (oluşturmanız) gerekir.

Varsayılan dil, app / config / app.php yapılandırma dosyasında saklanır ve varsayılan olarak İngilizcedir. Bu, App::setLocaleyöntem kullanılarak herhangi bir zamanda değiştirilebilir .

Hem hatalar hem de diller hakkında daha fazla bilgi burada doğrulama ve yerelleştirme bulunabilir .


2

Ben kullanıyorum Özel dil dosyalarımı şöyle "güzel isimler" için Giriş olarak :

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

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

2

Laravel 7'de.

use Illuminate\Support\Facades\Validator;

Sonra niceNames tanımlayın

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

Ve son olarak, $ niceNames'i dördüncü parametreye şöyle koyun:

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

1

: Özniteliği, güzel isimleri değil, yalnızca öznitelik adını (sizin durumunuzda ilk_ad) kullanabilir.

Ancak, her özellik için özel mesajlar tanımlayabilirsiniz + aşağıdaki gibi belirli mesajlarla doğrulama:

$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
Bu kod soruna bir çözüm sağlayabilir ancak bu kodun soruyu neden ve / veya nasıl yanıtladığına ilişkin ek bağlam sağlamanız şiddetle önerilir. Yalnızca kod yanıtları genellikle uzun vadede işe yaramaz hale gelir çünkü gelecekte benzer sorunları yaşayan izleyiciler çözümün arkasındaki mantığı anlayamazlar.
E. Zeytinci

0

Pekala, bu oldukça eski bir soru, ancak birkaç tanesine, URL'de görünen dil sorununu şu şekilde çözebileceğimi belirtmeliyim:

  • Dil ve fallback_language adresinin değiştirilmesi config/app.php;
  • veya \ App :: setLocale ($ lang) ayarlayarak

Oturum boyunca devam etmem gerekirse, bunu yapmak için şu anda "AppServiceProvider" ı kullanıyorum, ancak dili URL'ye göre değiştirmek gerekirse bir ara yazılımın daha iyi bir yaklaşım olabileceğini düşünüyorum, bu nedenle sağlayıcımda şunu seviyorum:

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

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

Bu şekilde oturumu idare ederim ve urlime yapışmaz.

Açıklığa kavuşturmak için şu anda Laravel 5.1+ kullanıyorum ancak 4.x'ten farklı bir davranış olmamalı;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.