web-dev-qa-db-ja.com

Laravel 5.6 $ this-> validate vs Validator :: make()

_$this->validate_とValidator::make()の違いを尋ねる質問が他にもいくつかあるのを見ました。彼らは私が疑問に思っていた概念的な質問には本当に答えませんでした。

これらのそれぞれに適切な使用はありますか?どちらを使用するのが好きですか?

私が現在使用している方法は、APIクラスで$validator::make()でif elseを使用します(以下のように)一方で、プログラムのWeb部分では$ this->validate()を使用します(以下でも)

これはこれを使用する適切な方法ですか?

$ validator :: make:

_public function store(Request $request)
    {
        $validator = Validator::make($request->all(),[
            'name' => 'required',
            'url' => 'required',
            'isPublic' => 'required'
        ]);

        if($validator->fails()){
            return response($validator->messages(), 200);
        } else {

            Helpers::storeServer($request);

            return response()->json([
                'message'=> ['Server Stored']
            ]);
        }
    }
_

$ this-> validate:

_ public function store(Request $request)
    {

        $this->validate($request, [
            'name' => 'required',
            'url' => 'required',
            'isPublic' => 'required'
        ]);

        Helpers::storeServer($request);

        return redirect('dashboard')->with('success', 'Server stored');
    }
_
7
Striker

いいえ、2つの異なる方法でまったく同じことを行います。文字通り、$this->validate()は検証クラスのmake()メソッドを呼び出します。コントローラが拡張するcontroller.phpによって実装されたValidatesRequests.phpを見ると、 validate()メソッドの呼び出し:

_$validator = $this->getValidationFactory()
             ->make($request->all(), $rules, $messages, $customAttributes);
_

したがって、最終的にはmake()メソッドを使用することになります。 _$this->validate_が呼び出すため、処理方法に違いがあります。

_if ($validator->fails()) {
    this->throwValidationException($request, $validator);
}
_

したがって、Validator::make()を使用すると、$this->validate()が検証例外を自動的にスローする代わりに、自分で例外を処理できます。これは何かをするのに便利ですbeforeリダイレクト。これを最初の例で示します。これは、処理方法を決定する前に検証が失敗するかどうかを確認するためです。 2番目の例では、検証が失敗した場合、要求が自動的に拒否されることを知っています。

10
N Mahurin

$this->validateのルールに失敗すると、自動的にエラーがスローされます

$validator::make:エラーを簡単に処理できます。任意のデータをarray()にラップして、検証のために$validator::make:に渡すこともできます。

また、FormRequest + Route Model Bindingを使用する場合

あなたのstore()はこのように見えます

public function store(YourFormRequestRules $request)
    {
        Helpers::storeServer($request);

        return redirect('dashboard')->with('success', 'Server stored');
    }

public function update(YourFormRequestRules $request, Post $post)
{
    $post->title = $request->input('title');
    $post->save();
    return redirect()->route('example.index');
}

それで全部です

1
kenken9999

$this->validate()を使用すると、YourControllerController特性を使用するValidatesRequestsクラスを拡張し、次のようになります。

_namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
_

ValidatesRequests特性自体は、ベースコントローラーが取得するいくつかのメソッドで構成され、次に独自のコントローラーで構成されます。

_validateWith($validator, Request $request = null)
...
validate(Request $request, array $rules, array $messages = [], array $customAttributes = [])
...
validateWithBag($errorBag, Request $request, array $rules, array $messages = [], array $customAttributes = [])
... and so on...
_

これらのメソッドは、いくつかの検証を行い、エラー処理を非常に便利にし、実際には前述のvalidate()メソッドを考慮します。

渡された要求に検証エラーがある場合、不要なロジックでコントローラーをリテラリングせずに応答を処理するのに役立ちます。つまり、ajax呼び出しの場合、json本体を含む422応答を返しますが、返されるのはエラーバッグに入力し、_ajax以外のブレードテンプレートで使用する_$errors_変数を埋めます。

要約すると、これはValidatorのインスタンスを作成して手動検証を行いたくない場合にのみ役立ち、開発者が実際の作業に集中できるようにします;)

UPDATE:

_$validator = Validator::make() //creates an instance of the validator for further operations

// You can even do after the creating the instance of validator:
$this->validateWith($validator, $request)

//Lets do both steps above i.e the validation and trigger the Validation Exception if there's failure.
$this->validate($request, [...rules...], [...messages..]) 
_

チェック: https://laravel.com/docs/5.6/validation#quick-writing-the-validation-logic