検証は Laravel Eloquent モデルの特性であり、モデルが保存される前に検証基準を満たしていることを確認します。それらが有効であるとみなされない場合、モデルは保存されず、検証エラーが利用可能になります。
検証では複数のルールセットが許可され、モデル ID をunique
検証ルールに挿入し、失敗した検証で例外を発生させます。小さくて柔軟なのでワークフローにぴったりフィットし、有効なデータのみを保存できます。
Laravel 4.2 以降で Validating を使用したいですか?ドキュメントとインストール手順については、0.10.x ブランチを参照してください。
Laravel 4.2 バージョンは、フォーム検証の実行により適しています。カスタム検証メッセージ、確認ルール、および複数のルールセットをサポートします。 Laravel 5.0にはFormRequest
検証があるため、Validatingはコアデータを有効に保ち、フォーム検証をフレームワークに任せるように設計されています。
Laravel 5.0 から 5.2 で Validating を使用したいですか?ドキュメントとインストール手順については、2.x ブランチを参照してください。
Laravel 5.0 - 5.2 バージョンでは、Laravel フレームワークの廃止予定のValidationException
コントラクトを使用していました。 Laravel 5.3 では、コア検証ValidationException
拡張しました。これは、 FormRequest
と同様に、検証エラーが発生した場合、フレームワークが自動的にエラーを返してリダイレクトすることを意味します。
読み続けてください。これらの手順はあなたのためのものです。
単純に、 composer.json
ファイルがあるプロジェクト ディレクトリに移動し、次のように入力します。
コンポーザーにはワトソン/検証が必要です
Laravel 4.2 以降のインストール手順を参照してください。 Laravel 5.0 ~ 5.2 のインストール手順を参照してください。
まず、特性をモデルに追加し、必要に応じて検証ルールとメッセージを追加します。
WatsonValidatingValidatingTrait を使用する;クラス Post は Eloquent を拡張します { ValidatingTrait を使用します。 protected $rules = [ 'title' => 'required', 'slug' => 'required|unique:posts,slug', 'content' => 'required' ]; }
BaseModel を使用している場合は、特性をBaseModel
に追加することもできます。これは、そこから拡張されるすべてのモデルで機能します。それ以外の場合は、 Eloquent
代わりにWatsonValidatingValidatingModel
拡張するだけです。
注: 特性を使用するBaseModel
から拡張するモデルに$rules
プロパティを設定するか、空の配列をBaseModel
の$rules
として設定する必要があります。そうしないと、必然的にLogicException with message 'Relationship method must return an object of type IlluminateDatabaseEloquentRelationsRelation'
。
これで、いくつかの便利な機能にアクセスできるようになりました。
// モデルが有効かどうかを確認します。$post->isValid(); // true// または、無効かどうかを確認します。$post->isInvalid(); // false// モデルの有効性を判断したら、// エラーを取得できます。$post->getErrors(); // エラーメッセージバッグ
モデルの検証も非常に簡単になります。
if ( ! $post->save()) {// おっと、return redirect()->route('posts.create') ->withErrors($post->getErrors()) ->withInput(); }return redirect()->route('posts.show', $post->id) ->withSuccess("投稿は正常に保存されました。");
それ以外の場合、モデルの検証時に例外を使用したい場合は、 saveOrFail()
メソッドを使用できます。現在は、無効なモデルを保存しようとすると例外が発生します。
$post->saveOrFail();
例外をキャッチしたくない場合は、その必要はありません。 Laravel はValidationException
の処理方法を知っており、フォーム入力とエラーを自動的にリダイレクトします。自分で処理したい場合は可能ですが。
{$post->saveOrFail(); を試してください。 catch (WatsonValidatingValidationException $e) {$errors = $e->getErrors();return redirect()->route('posts.create') ->withErrors($errors) ->withInput(); }
withErrors($e)
のようにwithErrors()
メソッドに例外を渡すだけで、Laravel がそれを処理する方法を認識することに注意してください。
モデルを使用していて、検証をバイパスして保存を実行したい場合は、それが可能です。これは、特性のないモデルでsave()
を呼び出した場合と同じ結果を返します。
$post->forceSave();
saveOrFail()
使用する代わりに、 save()
メソッドを使用するときにデフォルトで例外をスローしたい場合は、モデルまたはBaseModel
で次のプロパティを設定するだけです。
/** * モデルが検証に失敗した場合に * ValidationException をスローするかどうか。設定されていない場合は、デフォルトで false になります。 * * @var boolean */protected $throwValidationExceptions = true;
例外または戻り値を使用して 1 回限りの保存を実行する場合は、 saveOrFail()
メソッドとsaveOrReturn
メソッドを使用できます。
カスタム検証エラー メッセージを表示するには、 $validationMessages
プロパティをモデルに追加するだけです。
/** * バリデーターに渡される検証メッセージ。 * * @var array */protected $validationMessages = ['slug.unique' => "別の投稿がすでにそのスラッグを使用しています。"];
スラッグに対してunique
ルールを使用していることに気づいたかもしれませんが、永続化されたモデルを更新している場合は機能しません。幸いなことに、Validation がこれを処理し、ルールが期待どおりに機能するようにモデルの主キーをルールに追加します。現行モデルは無視してください。
モデルで$injectUniqueIdentifier
プロパティを設定することで、この機能を調整できます。
/** * 検証を試みる前に、モデルがその識別子を * 一意の検証ルールに挿入する必要があるかどうか。このプロパティがモデルに設定されていない場合、 * デフォルトで true になります。 * * @var boolean */protected $injectUniqueIdentifier = true;
そのままの状態で、Laravel が提供するunique
ルールをサポートします。人気の felixkiss/uniquewith-validator ルールもサポートしていますが、オプトインする必要があります。検証特性をインポートした後、 use WatsonValidatingInjectorsUniqueWithInjector
を追加するだけです。
必要に応じて、追加の注入ルールも簡単にサポートできます。 (理由は何であれ) 単純にモデルの主キーを取得するunique_ids
という追加ルールをサポートしたいとします。既存のパラメータとフィールド名を受け入れ、置換ルールを返すキャメルケースのルールを追加するだけです。
/** * unique_ids ルールを準備し、必要に応じてモデル識別子を追加します。 * * @param array $parameters * @param string $field * @return string */protected function prepareUniqueIdsRule($parameters, $field) {// モデルが永続化されている場合にのみ置換を実行します。if ($this->exists) {return 'unique_ids:' . $this->getKey(); 'unique_ids' を返します; }
この場合、モデルが保存されており、主キーが10
である場合、ルールunique_ids
unique_ids:10
に置き換えられます。
検証プロセス中にトレイトによってさまざまなイベントが発生し、これをフックして検証プロセスに影響を与えることができます。
フックするには、まず$observeables
プロパティをモデル (または基本モデル) に追加する必要があります。これにより、モデルがこれらのイベントに応答できることが Eloquent に通知されるだけです。
/** * ユーザーが公開する監視可能なイベント * * @var array */protected $observables = ['validating', 'validated'];
検証が行われようとすると、 eloquent.validating: ModelName
イベントが発生し、 $event
パラメーターがsaving
またはrestoring
になります。たとえば、名前空間モデルAppUser
更新している場合、イベントはeloquent.validating: AppUser
になります。これらのイベントのいずれかをリッスンして値を返すと、検証の発生を完全に防ぐことができます。
Event::listen('eloquent.validating:*', function($model, $event) {// 疑似ロシアン ルーレットの検証.if (rand(1, 6) === 1) {return false; } });
検証が行われた後は、 validated
イベント、 passed
failed
、 skipped
イベントなど、フックできる一連の検証済みイベントも存在します。検証に失敗した上記の例では、イベントeloquent.validated: AppUser
を取得できます。
現在、Laravel にはバグがあり (問題 #1181 を参照)、テスト スイート内でモデル イベントが複数回発生することを妨げています。これは、モデル テストを使用する最初のテストは合格しますが、後続のテストは失敗することを意味します。そのスレッドには、当面の間テストを成功させるために使用できる一時的な解決策がいくつかリストされています。
Laravel はバグとプルリクエストの追跡を目的として Liferaft に切り替えたため、上記の問題は利用できない可能性があります。この Gist には、テスト間ですべてのモデルのイベントをリセットして期待どおりに動作するようにする方法を示すサンプルTestCase.php
が含まれています。
コントローラーで検証検証モデルを使用するにはさまざまな方法がありますが、ここでは Laravel 5 の新しい FormRequest を使用する 1 つの例を示します (FormRequest を使用しない別のコントローラーの例を見たい場合は、チェックしてください)このパッケージの 4.2 以降のバージョン。
この例では、FormRequest がフォーム検証を処理し、モデルが独自の検証を処理できるようにすることで、コードをクリーンに保ちます。検証例外を有効にすることで、反復的なコントローラー コード (try/catch ブロック) を削減し、モデル検証例外をグローバルに処理できます (フォーム リクエストではモデルを有効に保つ必要があるため、モデルが無効になった場合は例外的なイベントになります)。
<?php namespace AppHttpControllers;use AppHttpRequestsPostFormRequest;use IlluminateRoutingController;class PostsController extends Controller {protected $post;パブリック関数 __construct(Post $post) {$this->post = $post; }// ...パブリック関数ストア(PostFormRequest $request) {// Post は、有効でない場合は例外をスローします。$post = $this->post->create($request->input());// Post は正常に保存されました。return redirect()->route( 'posts.show', $post); } }
その後、 app/Exceptions/Handler.php
でモデル検証例外をキャッチし、必要に応じて処理できます。
パブリック関数 render($request, Exception $e) {if (WatsonValidatingValidationException の $e インスタンス) {return back()->withErrors($e)->withInput(); }parent::render($request, $e); }