Laravel検証属性「素敵な名前」


82

「language> {language}> validate.php」の検証属性を使用して、:attribute name(入力名)を適切な読み取り名(例:first_name> First name)に置き換えようとしています。使い方はとても簡単に思えますが、バリデーターには「素敵な名前」が表示されません。

私はこれを持っています:

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

エラーを表示する場合:

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

そして、コントローラーでの検証:

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

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

誰かが私が間違っていることを教えてもらえますか?:attribute名を属性配列(言語)の「nicename」に置き換えたい。

ありがとう!

編集:

問題は、Laravelプロジェクトにデフォルトの言語を設定していないことに気づきました。言語を「NL」に設定すると、上記のコードが機能します。ただし、言語を設定すると、その言語はURLに表示されます。そして、私はそうではないことを好みます。

だから私の次の質問:URLから言語を削除すること、またはデフォルトの言語を設定してそこに表示されないようにすることは可能ですか?


正しく理解できるかどうかはわかりませんが、翻訳サービスプロバイダーが使用するデフォルトの言語をapp / config /app.phpで設定できます。言語ごとに、app / lang /に対応するフォルダーを作成する必要があります。たとえば、アプリで使用する言語として「en」と「nl」がある場合は、app / lang /に対応するファイル(この例ではvalidation.php)を含む両方のフォルダーがあるはずなので、言語を変更するたびにそのファイルロードされます。URLから言語を削除することに関しては、完全にはわかりませんが、ルートを使用してそれを達成できると思います。
Altrim 2013年

言語を設定する方法を知っており、入力名の翻訳が機能しています。URLから言語を削除する方法を知る必要があるだけです。それを探します。ありがとう!
ハク2013年

間違いなくこれを行うことができます。以下の私の答えを参照してください。
ハビエルカディス

しかし、それは5.3用ですstackoverflow.com/a/41904035/1076753
2017年

回答:


143

ええ、あなたがそれを呼んだ「素敵な名前」の属性は、数ヶ月前の本当の「問題」でした。うまくいけば、この機能は現在実装されており、非常に簡単に使用できます。

簡単にするために、この問題に取り組むために2つのオプションを分割します。

  1. グローバルおそらくもっと普及している。このアプローチはここで非常によく説明されてますが、基本的にはapplication / language / XX /validation.php検証ファイルを編集する必要があります。XXは検証に使用する言語です。

    下部に属性配列が表示されます。それが「素敵な名前」の属性配列になります。あなたの例に従うと、最終結果は次のようになります。

    'attributes' => array('first_name' => 'First Name')
    
  2. ローカルでこれはテイラーオトウェルが彼が言うときに問題で話していたものです:

    これで、ValidatorインスタンスでsetAttributeNamesを呼び出すことができます。

    これは完全に有効であり、ソースコードを確認すると表示されます

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

    したがって、この方法を使用するには、次の簡単な例を参照してください。

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

リソース

Githubには、すぐに使える言語パッケージがたくさんある本当に素晴らしいリポジトリがあります。間違いなくあなたはそれをチェックする必要があります。

お役に立てれば。


2
グローバルソリューションには問題があり'name' => 'Customer name'ます'name'=>'Seller name'。ある形式では私が持っているかもしれませんし、別の形式ではそうかもしれません。モジュールごとに翻訳を行うことを好むので、これらの値をフォームフィールドのラベルとしても再利用できます。したがって、ローカルソリューションに投票しますが、言語ファイルからその$ niceNames配列を取得するにはどうすればよいですか?またsetAttributeNames、新しいValidatorインスタンスを作成せずに、コントローラーで使用できる$ this-> validate()メソッドを使用して呼び出すにはどうすればよいですか?
JustAMartin 2015

2
このコメントに応えて、@ javiercadizのソリューションを完成させるために、Laravel 5.1以降、4番目のパラメーターを使用$this->validate(Request $request, $rules, $messages, $customAttributes)してこれらの素敵な名前を付けることができます。Laravel 5.1 API
Fran Arjona 2015年

最後のオプションのどこにコードを配置しますか?私はこの部分を意味します: $validator = Validator::make(Input::all(), $rules); $validator->setAttributeNames($niceNames);
Jenthe 2016年

ちなみに、「ローカル」ソリューションを使用している場合は、次のような言語ファイルから属性名をロードできます$validator->setAttributeNames(Lang::get('my-language-file'))
orrd 2016

31

この特定の問題に対する正解は、app / langフォルダーに移動し、ファイルの下部にあるvalidation.phpファイルを編集することです属性と呼ばれる配列があります

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

したがって、この配列は、これらの属性名を具体的にカスタマイズするために作成されたと思います。


3
これはスペイン語で回答するための最良の答えです 'attributes' => [ 'name' => 'nombre', 'mail' => 'correo', 'password' => 'contraseña', 'password2' => 'confirmación de contraseña', ],

1
Laravel 5.6で動作
Yevgeniy Afanasyev 2018

27

Laravel 5.2以降、次のことが可能になりました...

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

「属性」配列では、キーは入力名であり、値はメッセージに表示する文字列です。

このような入力がある場合の例

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

(validation.phpファイル内の)配列は次のようになります。

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

私は同じことを試しましたが、うまくいきました。お役に立てれば。

編集

また、パラメータを渡さないことに気付いた$errors->has()ので、おそらくそれが問題です。

このようなコードがある場合、これを修正するには、コントローラーでチェックアウトしてください

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

次に、このようにhas()「レジスタ」キー(または使用しているもの)をメソッドに渡す必要があります。

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

エラーメッセージを表示する別の方法は、私が好む次の方法です(私はデザインにTwitter Bootstrapを使用していますが、もちろん、独自のデザインで変更することもできます)

 @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
フィールド名が配列の場合はどうなりますか?たとえば、<input type="text" name="txt[]" />"。エラーはのようなものを出力しますThe txt.0 is required.。どうすればいい名前に置き換えることができますか?
アンナフォーチュナ2014年

@AnnaFortunaこの投稿をチェックして、stackoverflow.com
questions / 17974231 /…

@Altrimに感謝します、私はそれをチェックします。
アンナフォーチュナ

4

Laravel 4.1では、これを行う簡単な方法は、langフォルダー->言語(デフォルトはen)-> validation.phpに移動することです。

モデルにこれがある場合、たとえば:

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

また、エラーを「グループIDを入力してください」にしたくない場合は、validation.phpにカスタム配列を追加することで「適切な」検証メッセージを作成できます。したがって、この例では、カスタム配列は次のようになります。

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

これは多言語アプリでも機能します。正しい言語検証ファイルを編集(作成)するだけです。

デフォルトの言語はapp / config / app.php構成ファイルに保存されており、デフォルトでは英語です。これは、App::setLocaleメソッドを使用していつでも変更できます。

エラーと言語の両方の詳細については、検証ローカリゼーションを参照してください


2

私はカスタム言語ファイルを次のような「素敵な名前」の入力として使用します

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

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

2

Laravel7で。

use Illuminate\Support\Facades\Validator;

次に、niceNamesを定義します

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

そして最後に、次のように4番目のパラメーターに$ niceNamesを入力します。

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

1

:attributeは、属性名(この場合はfirst_name)のみを使用でき、適切な名前は使用できません。

ただし、次のようにメッセージを定義することで、属性+検証ごとにカスタムメッセージを定義できます。

$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
このコードは問題の解決策を提供する場合がありますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供することを強くお勧めします。同様の問題を経験している将来の視聴者は解決策の背後にある理由を理解できないため、コードのみの回答は通常、長期的には役に立たなくなります。
E.Zeytinci20年

0

まあ、それはかなり古い質問ですが、URLに言語が表示されるという問題は次の方法で解決できることを指摘する必要があります。

  • で言語とfallback_languageを変更しconfig/app.phpます。
  • または\ App :: setLocale($ lang)を設定します

セッションを通じて永続化する必要がある場合は、現在「AppServiceProvider」を使用してこれを行いますが、URLで言語を変更する必要がある場合はミドルウェアの方が適していると思うので、プロバイダーでは次のようにします。

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

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

このように私はセッションを処理し、それは私のURLに固執しません。

明確にするために、私は現在Laravel 5.1+を使用していますが、4.xと異なる動作であってはなりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.