2017-11-16 46 views
1

Laravel documentationを引用:デフォルトではなぜvalidate()メソッドはrequest()経由でアクセスできますか?

、Laravelのベースコントローラクラスは、強力な検証ルールの様々な着信HTTPリクエストを検証するための便利な方法を提供ValidatesRequestsトレイト

を使用していますそれは読んで、本当ですコードApp\Http\Controllers\Controllerは実際にValidatesRequests形質を使用しています。 ValidatesRequestsにはvalidateメソッドがあります。

私にとって本当に奇妙なのは、ドキュメント内のどこにいてもvalidateメソッドが$requestオブジェクトで呼び出されているということです。そしてそれはこのように機能します。このコードでフォームを検証できます:

public function store() 
{ 
    $attributes = request()->validate([ 
     'name' => 'required|string|max:255', 
    ]); 
    // ... 
} 

しかし、私はRequestクラスにバリデーションメソッドが存在するとは見ません。ファイルの先頭にちょうど奇妙なコメント行:

/** 
* @method array validate(array $rules, array $messages = [], array $customAttributes = []) 
*/ 

ので、2つのものがあります:

  • 私はLaravelのマニュアルに信頼するのか分かりません。
  • $requestオブジェクトで検証がどのように機能するのか分かりません。

そして、私の実際の質問は:

は私が$requestオブジェクトを介してvalidateメソッドを使用する場合は、まだ真のドキュメントから貼り付けた初期の引用ですか?もしそうなら、どのように機能しますか?

答えて

0

"奇妙なコメント"はremoved a couple days agoでした。

私はRequestvalidate機能をRequest::macro('validate', ...)の電話番号FoundationServiceProvider.phpから取得すると考えています。マクロの詳細については、this articleを参照してください。

+0

ありがとう!この場合、 'ValidatesRequests'は役に立たないと思いますが、Laravelの最初の引用は今では無関係ですか? (なぜなら、最初の引用文が 'ValidatesRequests'特性があることを考慮していないので、文書全体が書かれているからです) –

+0

@ rap-2-hいいえ、それは無駄ではありません。彼らはさまざまな状況のためです。 *コントローラ*と 'request() - > validate()'の '$ this-> validate()'は同じものではありません。 – ceejayoz

+0

申し訳ありませんが、私は "役に立たない"(とにかく、私はそれを書いた)という意味ではありませんでした。私は "あなたはValidatesRequestsが使用されていないと思う?*このケースでは... [...]?"とりあえずありがとう! –

1

よく、メソッドがありますが、FormRequestには直接ありませんが、ValidatesWhenResolvedTraitという特性にありますので、FormRequestでは問題なく使用できますので、ドキュメントは問題ありません。

trait ValidatesWhenResolvedTrait 
{ 
    /** 
    * Validate the class instance. 
    * 
    * @return void 
    */ 
    public function validate() 
    { 
     $this->prepareForValidation(); 

     $instance = $this->getValidatorInstance(); 

     if (! $this->passesAuthorization()) { 
      $this->failedAuthorization(); 
     } elseif (! $instance->passes()) { 
      $this->failedValidation($instance); 
     } 
    } 

はそうあなたがコントローラで実行されている:この形質の冒頭に

見てみましょう

request()->validate 

あなたはトレイトからメソッドを実行しているとValidatesRequestsが、このと共通で何もしています。また

あなたは何ができるの検証「コントローラ道」を使用したい場合:

$this->validate(request(), [ 
     'name' => 'required|string|max:255', 
    ]); 

、今あなたがValidatesRequestsリクエストからvalidate方法を使用することになります。

ご覧のとおり、Laravelで検証を実行する方法は複数あります。私は個人的に代わりにフォーム要求の検証のみを使用します。

+0

ありがとう!私は少し失われています。この 'validate'メソッドは、' request() - > validate(...) 'を呼び出すときに提供した例で呼び出されたものですか?私はこの中に何のパラメータも見ていないし、同じ目的ではないようだ...(しかし、私は間違っている、時には私はLaravelの "魔法"側で失われている)。 –

+0

少し前に自分の答えを更新しました。 'request() - > validate()'を実行すると、私は答えの始めにあなたが示したメソッドを実行し、 '$ this-> validate(request()'を実行している場合は、 'ValidateRequests 'コントローラの特性 –

関連する問題