前回は、Createビューを作成し、バリデーションを作成するところまでをやりましたが、Laravel5からは、『フォームリクエスト』によるバリデーション機能が追加されました。今日はそのフォームリクエストバリデーションについて調べてみたいと思います。
フォームリクエストバリデーション
ファームリクエストは、バリデーションロジックを含んだカスタムロジックリクエストクラスです。フォームリクエストは、artisanコマンドで簡単に生成することができます。
それでは、コマンドプロンプトから下記のように入力します。
cd C:\xampp\htdocs\laravel php artisan make:request GathersPostRequest
GathersPostRequest.php(フォームリクエスト)が生成されました。中身を見てみましょう。
app/Http/Request/GathersPostRequest.php
<?php namespace App\Http\Requests; use App\Http\Requests\Request; class GathersPostRequest extends Request { public function authorize() { return false; } public function rules() { return [ // ]; } }
authorizeメソッドとrulesメソッドが生成されています。このrulesメソッドに、下記のようにバリデーションルールを記述します。
public function rules(){ return [ 'name' => 'required', 'code' => 'required', ]; }
それでは、このフォームリクエストバリデーションを実際に使用するには、どのようにすればいいのでしょうか。これは、実に簡単です。実際にこのバリデーションを使用したいコントローラのメソッドで、このリクエストをタイプヒントで指定すればいいのです。
前回作成した、postCreateを下記に記述してみます。
public function postCreate(Request $request){ $val=\Validator::make($request->all(),[ 'name'=>'required', 'code'=>'required', ]); if($val->fails()){ return redirect()->back()->withErrors($val->errors()); } }
上記のRequest(タイプヒント)を、GathersPostRequestに変更するだけです。
public function postCreate(GathersPostRequest $request){ }
これだけで、下記のようにバリデーションを勝手に実施してくれます。
つまり、前回作成した$val=...から、return redirect()->.....迄を自動的に生成してくれます。
尚、artisanコマンドで生成されたフォームリクエストは、デフォルトで、authorizeメソッドがfalseになっていますので、このまま実行すれば、403ステータースコードのHTTPレスポンスが自動的に返されますので、『Forbidden』と表示され、コントローラメソッドは実行されません。
後で使用するとは思いますが、今はフォームリクエストの認証機能は使用しませんので、falseをtrueにしておいてください。
エラーの日本語化
エラー表示が英語なのが気になりますので、これを日本語に変更したいと思います。川瀬裕久氏から日本語変換のパッケージを提供していただいていますので、それを使用させていただきたいと思います。
composer.jsonのrequireセクションの10行目あたりに、comja5パッケージを追加します。
app/composer.json
"require": { "laravel/framework": "5.0.*", "laravelcollective/html": "~5.0", "laravel-ja/comja5": "~1" //この行を追加します },
追加したら、コマンドプロンプトからcomposer updateを実行します。
comja5パッケージがインストールされたら、コマンドプロンプトから、下記のように実行します。
php vendor\laravel-ja\comja5\main.php -a
これで、エラー表示が日本語になりました。
モデルの生成
それでは、いよいよ新規データを登録するために、モデルを生成します。モデルの生成もartisanコマンドを使用します。
コマンドプロンプトから下記のように実行します。
php artisan make:model Gather
尚、今後、cd C:\xampp\htdocs\laravelは、省略しますので、コマンドプロンプトからのコマンド入力は、基本的にlaravelがインストールされているフォルダ(ディレクトリ)から実行するようにしてください。
appフォルダの直下に下記のようにGather.phpファイルが生成されました。
app/Gather.php
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Gather extends Model { // }
Gather::create()メソッドでデータが一括登録できるように、複数代入のホワイトリストを記述します。上記の4行目に下記を挿入してください。
protected $fillable=['name','code','description'];
新規データの登録
それでは、フォームからデータを取得して、データベーステーブルに登録してみましょう。
まず、アクションメソッド内でGatherモデルが使用できるように、use演算子でGatherモデルを、インポートします。
app/Gather.php
use App\Gather;
そして、postCreateを下記のように修正します。
public function postCreate(GathersPostRequest $request){ $gather=Gather::create($request->all()); $gather->save(); }
それでは、実際にブラウザからデータを入力してみましょう。
下記のようにデータベーステーブルに保存されました。
本日は、ここまでにします。
本日のポイント
- artisanコマンドで簡単にフォームリクエストが生成できる
- php artisan make:request フォームリクエストファイル名
- 生成されたフォームリクエストには、authorizeメソッドとrulesメソッドがある
- バリデーションは、フォームリクエストのrulesメソッド内に、バリデーションルールを記述するだけでOK!
- public function rules(){
return [
'name' => 'required',
'code' => 'required',
];
}
- public function rules(){
- フォームリクエストを使用するには、コントローラのタイプヒントにフォームリクエストを指定するだけ
- public function postCreate(GathersPostRequest $request){
}
- public function postCreate(GathersPostRequest $request){
- モデルは、artisanコマンドで簡単に生成することができる
- php artisan make:model モデル名
- モデルは、appフォルダの直下に生成される
- モデル名は、単数形で、アッパーキャメル記法で記述する
- 複数代入のホワイトリストは、$fillableで、ブラックリストは、$guardedで設定する
- protected $fillable=['name','content'];
- protected $guarded=['id',account_id'];
次回は、作成したデータの一覧表を作成します。