Laravel 入門 ch4-2 バリデーション

フォームの作成とリクエストの受け取り方法

やること

  • コントローラーの作成
  • ビューの作成(お問い合わせ画面)
  • ルーティング設定

コントローラーの作成

Php artisan make:controller FormController

※注意点

  • 用意するアクション
    • index(フォーム画面表示)
    • post(リクエスト受信後の画面表示)

ビューの作成

resourceフォルダ以下にform.blade.phpを作成

※ 注意点

  • {{csrf_field()}}の記述漏れ
  • <form action=“/form">のformの部分(post送信時のルーティングのパス名)
Route::post(‘form <= この部分',’FormController@post'); 

ルーティング設定

Route::get('form','FormController@index'); //フォーム画面表示
Route::post('form',’FormController@post'); //リクエスト受信後の画面表示

バリデーション

上記でフォームは完成だが、バリデーションしていないためどんな値でもpost送信される。 目的とは異なる値が入力された時は、getで「この入力は違うよ〜」って伝えたい。

バリデーションの流れはこんな感じ f:id:makoo5:20190807164409j:plain

最も簡単な方法はコントローラで処理を記述していく方法。

コントローラーの基底クラスに組み込まれているValidatesRequestsというトレイトに用意されているのでコントローラからバリデーション処理をしてあげるのが理解しやすい。

詳細まで詰めてみる(自分が気になった点)

  • トレイトとは?
  • 内部の実装について

トレイトとは?

PHPではクラスの多重継承ができない・・・

ということでPHP5.4から追加された機能がトレイト

//NG
class Sample3 extends Sample1,Sample2 {

}

//OK (トレイトというまとまりにしてuseでインポートする)
class Sample3{
    use Sample1,Sample2;

}

//これ
trait Sample1{}
trait Sample2{}

内部の実装について

FormController.php(Controllerを継承)
class FormController extends Controller

Controller(ValidatesRequestsがインポートしている)
class Controller extends BaseController

{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

}

ValidatesRequests(traitで定義されている)
namespace Illuminate\Foundation\Validation;

trait ValidatesRequests
{

public function validateWith($validator, Request $request = null)

//省略
}

作成

FormController.php#post
//ルールの設定
$validate_rule = [

'name' => ‘required',

'email' => 'email'

];

//validateする(正しい:POSTで処理してもらって、次の画面へ 間違い:GET送信でフォーム画面に戻る)
$this->validate($request, $validate_rule);

フィルターの種類(結構種類ある)

  • required :フォームが存在かつ空白じゃない
  • email :@がある
  • numeric :数値
  • between:0,100 :0~100まで

Method Illuminate\Validation\Validator::validateRequire does not exist.のエラーが出た場合

僕の場合はタイプミスだったので、打ち直したら直った。

//NG
'name' => ‘reqired’,

//OK
'name' => ‘required',

このままでは、GETで元の画面には戻るがエラーメッセージが出ないのでエラーメッセージが欲しい。

エラーメッセージの表示

バリデーションの機能にフィルターにかかると$errors(配列)にエラーメッセージが入っていく

xx.blade.php

//$errorsにkeyがnameの値があれば、表示する
@if($errors->has('name'))
    <p>{{$errors->first('name')}}</p>
@endif
<input name="name" placeholder="input name">

//$errorsにkeyがemailの値があれば、表示する
@if($errors->has('email'))
    <p>{{$errors->first('email')}}</p>
@endif
<input name="email" placeholder="input email">

これだとエラーメッセージが英語で出力される。 日本語対応にしたい時はバリデーションをカスタマイズすることになる。 その場合、フォームリクエストを作成していく。

フォームリクエス

コントローラの責務から極力フォーム内容のチェックは外したい。で外せるのでそれを試してみる。

作成

Http\Requests以下に作成

php artisan make:request ReqformRequest

用意されているメソッド

  • authorize

    • フォームリクエストの許可をtrue or falseで返す
  • rules

    • バリデーションルールを作成

Controller.php

use App\Http\Requests\ReqformRequest; //追記

//ReqformRequestを引数にとる(バリデーションされたrequestインスタンスを取得して、処理する)
public function post(ReqformRequest $request){

$data = [
        'msg'=>'フォームを入力してください'
        ];
return view('reqform',$data);

}

カスタマイズ

FormRequestの中のmessagesにはGet custom messages for validator errors.と書かれている。ここいじればエラーメッセージをカスタムできるっぽいのでReqformRequestでmessagesをオーバーライドする。

FormRequest.php

* Get custom messages for validator errors.
*
* @return array

*/
public function messages()

{
return [];

}

ReqformRequest

public function messages(){

return [

//‘項目名.ルール名’=>’エラーメッセージ'
'name.required'=>'名前を入力してください',
'email.email'=>'適切なメールアドレスを入力してください'
];
}

バリデーター

今まではフォーム入力に誤りが存在していたら、フォームページへリダイレクトするようになっていたが、違うページに飛ばしたい場合も出てくる。 その時バリデータを用意することでこれを実現することができる。

こういうのも使っていきたい。

Laravelが最初よりは徐々にわかってきた気がする。。

だが、Androidはいつやろうw