web-dev-qa-db-ja.com

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

「言語> {言語}> validation.php」の検証属性を使用して、読み取り可能な適切な名前(例:first_name>名)の:attribute 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 nameを、attributes配列(言語)の「Nice name」に置き換えたいです。

ありがとう!

編集:

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

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

79
Hak

うん、あなたがそれを呼んだ「ナイスネーム」属性は、数ヶ月前に本当の「問題」でした。この機能が 実装済み になり、非常に簡単に使用できるようになることを願っています。

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

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

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

    'attributes' => array('first_name' => 'First Name')
    
  2. 局所的にこれは、テイラー・オットウェルが issue で言っていたことです:

    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 には非常に素晴らしいレポジトリがあり、多くの言語パッケージをすぐに使用できます。ぜひチェックしてみてください。

お役に立てれば。

137
Javier Cadiz

この特定の問題に対する正しい答えは、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
),

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

25
Logus

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 
21
ShirleyCC

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

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

 <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()メソッドに「register」キー(または使用しているもの)を次のように渡す必要があります。

@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>
8
Altrim

遅い回答ですが、誰かを助けるかもしれません

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

そして、例えば、あなたがあなたのモデルにいるとき

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

エラーとして_please enter a group 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
John Smith

"Nice names"の入力としてカスタム言語ファイルを使用します:

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

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

:attributeは属性名(あなたの場合はfirst_name)のみを使用でき、Nice名は使用できません。

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

$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

まあ、それはかなり古い質問ですが、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と異なる動作であってはなりません。

0
Victor Moura