原文: https://laravist.com/article/15
Laravist は、私が立ち上げたばかりの Laravel コミュニティです。Laravel に関する質問があれば、お問い合わせください。私は、問題を解決するために最善を尽くし、将来的には次のようなビデオチュートリアルを録画する予定です。
https://laravist. com/lesson/1
ついに更新 これはこの Laravel チュートリアル シリーズの第 7 部であり、この期間中に他にもいくつか書きました。
ナンセンスな話はやめて、フォーム検証の部分に直接進みましょう。ほぼすべての Web アプリケーションにはフォームがあり、フォームは基本的にフォーム検証と切り離せません。 laravel では、実際にはフォーム検証を実行する方法が 2 つあります。Request を使用する方法と Validation を使用する方法です。これら 2 つの部分の内容については、以下で個別に説明します。最初の部分に重点を置き、最初の部分をフォーム検証に使用することをお勧めします。
理由最初の検証方法の説明に重点を置いてみてはいかがでしょうか。個人的には、最初の方法の方がメンテナンスが容易で、同じ検証条件でコードを再利用できると感じているためです。さらに、コードを記述する形式は、Laravel と私の個人的な使用習慣により適しています。コマンドラインを使用してコードを生成できます。つまり、artisan をツールとして使用できます。
php artisan make:request StoreArticleRequest
プロジェクト ディレクトリにあるArtisan の make:request コマンドを使用して、フォーム検証用の Request クラスを生成します。ここでは StoreArticleRequest という名前を付けています。好きな名前を付けることもできますが、後でコードを確認するときに、より人間らしい名前にすることをお勧めします。このコマンドで生成されたファイルは app/Http/Requests/ フォルダーにあります。このファイルを開いて見てみましょう:
class StoreArticleRequest extends Request{ /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return false; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ // ]; }}
があることがわかります。その中の 2 つのメソッド: authorize() と rules()。 authorize() は次のように単純に理解できます。このフォーム リクエスト (通常は投稿リクエスト) を処理するときに本人確認を実行する必要があるかどうかを示します。たとえば、A がコメントした場合、B はそれを編集できます。保持できない場合は保持されていれば false を返し、保持できる場合は変更されていれば true を返します。ここでのロジックは次のとおりです。記事を公開しているので、サイトに登録されているユーザー (登録が開いている場合) は記事を公開できるため、最初に authorize() メソッドを変更し、その戻り値を return true ; に変更します。
次に、 rules() メソッドについては、ここで検証ルールを設定する必要があります。たとえば、次の検証ルールを設定できます。
public function rules() { return [ 'title' => 'required', 'content' => 'required' ]; }
記事を作成するときは、タイトルとコンテンツという 2 つの送信フィールドがあります。これらは、article テーブルを設計するときに設定した 2 つのフィールドです。
上記の検証ルールは次のとおりです。タイトル フィールドとコンテンツ フィールドについては、ユーザーがコンテンツを入力する必要がありますが、空にすることはできません。
ここでのルールが設定されたので、どのように適用すればよいでしょうか?つまり、データベースに保存する前に記事をどのように検証するのでしょうか?これは非常に簡単です。 ArticleController の store() メソッドを少し変更するだけです。
public function store(Requests\StoreArticleRequest $request) { $input = $request->all(); //下面增加两行,顺便看看Request::get的使用 $input['intro'] = mb_substr($request->get('content'),0,64); }
StoreArticleRequest クラスのインスタンス全体を $request として store() メソッドに渡します。このとき、laravel
はフォーム検証を実行する必要があるかどうか (rules メソッドが検証ルールを定義しているかどうか) を自動的にチェックします。検証が必要な場合、laravel は最初に検証パスを実行します。 store() メソッド内 コードは実行されませんが、フォームが送信されるページ (http://blog.dev/article/create this page) に直接ジャンプします。すべての検証に合格すると、store() 内のコード、つまり $input = $request->all(); 以下のコードが実行されます。 。 。たとえば、空白のままにした場合にどのようになるかを試してみましょう。
上の図では変化がないように見えますが、実際には変化しています。一度送信しましたが、すぐに元に戻りました。次のメソッドを使用して確認できます:
@if($errors->any()) <ul class="alert alert-danger"> @foreach($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul>@endif
上記のコードを create.blade.php に追加します。後でここに記述します。 。ここでの一般的な意味は、フォーム検証エラー メッセージがある場合、その情報を出力してユーザーにフィードバックするということです。そうでない場合、情報は表示されません。もう一度試してみましょう:
この時点で、フォームの検証が失敗すると、対応するエラー メッセージがページに表示されることがわかります。間違いがなければ記事を作成します。
ヒント: エラー メッセージを英語にしたくない場合は、resources/lang/en/validation.php で変更するか、新しい言語ファイル パッケージを直接作成できます。
OK、これで、この検証プロセスは基本的に完了しました。ただし、実際の開発では、検証は必ずしもこれほど単純ではありません。フィールドに複数の検証ルールを設定したい場合はどうすればよいでしょうか。たとえば、記事のタイトルを少なくとも 3 バイトの長さにしたいとします。これは、 rules() メソッドで行うことができます:
'title' => 'required|min:3',
在laravel中,我们使用|将多个规则分开,:表示规则的值。其实这里你也可以使用数组的,但是我还是推荐大家像上面这样写,简洁明了。
至于更多地验证规则,比如注册的时候,验证一个email和确认密码的时候,我们怎么需要怎么写的呢?
'email'=>'required|email','password'=>'required|min:6|confirmed','password_confirmation' => 'required|min:6'
上面我直接给出这两个常用场景的最常见的写法,email就代表验证所填的信息是否是一个正确地邮箱格式了,至于确认密码就使用confirmed来指定,这里注意是confirmed而不是confirme。而且第二次输入密码的字段需要写成password_confirmation这个形式,也就是在视图中,我们会有类似这样的input表单:
<input type="password" name="password" /><input type="password" name="password_confirmation" />
关于更多验证规则,参考官方文档:
http://laravel.com/docs/5.1/validation
使用这个之前可以将store(Requests\StoreArticleRequest $request)中的变量去掉
使用Validation的时候,多用于验证一些简单的表单验证。这里演示直接写于ArticleController当中,直接使用Validator::make(),使用方式为Validator::make(array $request,array $rules),比如说我们的例子可以在store()中写成:
$input = Request::all();$validator = Validator::make($input, [ 'title' => 'required|min:3', 'body' => 'required',]);
然后可以使用下面这样的方式来检查验证有没有通过:
if ($validator->fails()) { }
验证通过之后,我们才进行下一步操作,比如将数据存入数据库。一个基本的Validation流程就完成了,而且关于Validation的部分,我也只想介绍到这里,因为我会安利大家使用第一种方式:Request。
tips:这两种方式的背后都是使用一样的验证机制。
这里就基本将基础的表单验证说完了,下一节我准说说queryScope和SetAttributes的使用,这两个对于我们的数据入库的预处理和代码重用都很有帮助,所以下次会先说这两个知识点:我们会先对published_at这个字段的设置和使用发挥出来,到时候你就知道设置这个字段的好处了。
最后:Happy Hacking