Request各種
LaravelでのPOST/GETでの値の受渡し方法にはいくつかある。
・Input (Facade)
・Request (Facade/DI)
・FormRequest (DI)
の3つが、主だったもの。
###Input
利用にはuse Input;とする。
$name = Input::get('name');
$email = Input::get('email');
###Request
####Facade
利用にはuse Request;とする。
$name = Request::input('name');
$email = Request::input('email');
全てのリクエストは、
$all = Request::all();
で取得可能。
####Dependency Injection (DI)
DIの際は、Facadeではなく、use Illuminate\Http\Request;とする。
<?php namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class HogeController extends Controller{
public function res(Request $request){
$name = $request->input('name');
$email = $request->input('email');
return $name."-".$email;
}
}
###FormRequest (Laravel5)
まずは、artisanを利用してFormRequestクラスを作成します。もちろん手書きでもいいです。作成すべき場所はapp/Http/Requests/です。
php artisan make:request HogeRequest
すると、以下のようなapp/Http/Request/HogeRequest.phpが生成されます。
<?php namespace App\Http\Requests;
use App\Http\Requests\Request;
class HogeRequest 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 [
//
];
}
}
rules()にValidationルールを、authorize()に認証結果の有無を記述します。authorize()は通常はtrueとします(誰でもOKなので)。
####改変
とりあえず。
<?php namespace App\Http\Requests;
use App\Http\Requests\Request;
class HogeRequest extends Request {
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name'=>'required',
'email'=>'required'
];
}
}
####Controller
データの受渡しは、Requestがカスタムのクラスになるだけ。ここでは、useせずにfull pathで記述しています。
何もしなくても値の受渡しはもちろん、自動的にValidationが行われます。エラーの場合、呼び出し元に自動的にリダイレクトします。
バリデーションの記述は明示的にはない。
<?php namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class HogeController extends Controller{
public function res(\App\Http\Requests\HogeRequest $request){
$name = $request->input('name');
$email = $request->input('email');
return $name."-".$email;
}
}
この時、DIするクラスを変えることで、バリデーションルールも変えることができる。新規登録と更新でルールを変えたいときなどは便利。モデルにvalidationを書くのは一見エレガントだけど、実際は柔軟性に欠ける。
####メッセージのカスタマイズ
エラーメッセージをカスタマイズするためにはFormRequest(HogeRequest)にmessages()を実装します。
<?php namespace App\Http\Requests;
use App\Http\Requests\Request;
class HogeRequest extends Request {
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name'=>'required',
'email'=>'required'
];
}
//カスタムメッセージを設定
public function messages()
{
return [
'name.required'=>'名前は必ず入力して下さい。',
'email.required'=>'メールは必ず入力して下さい。'
];
}
}
####Viewでのエラー表示
エラーをViewで受け取るには$errorsを利用します。ここではnameの最初のエラーを取得しています。複数のエラーが想定される場合は、foreach($errors as $error){}などとして、loopして取得します。
@extends('master')
@section('title')
input
@stop
@section('body')
<form action="res" method="post">
<input type="input" name="name">
<input type="input" name="email">
<input type="submit" value="SEND">
<input type="hidden" name="_token" value="{{csrf_token()}}">
</form>
<?php echo $errors->first('name'); ?>
@stop