Laravel5でRequest各種（POST/GET値のやりとり）


# Request各種

LaravelでのPOST/GETでの値の受渡し方法にはいくつかある。

・Input (Facade)
・Request (Facade/DI)
・FormRequest (DI)

の３つが、主だったもの。

###Input

利用にはuse Input;とする。

```php
$name = Input::get('name');
$email = Input::get('email');
```

###Request

####Facade

利用にはuse Request;とする。

```php
$name = Request::input('name');
$email = Request::input('email');
```

全てのリクエストは、

```php
$all = Request::all();
```
で取得可能。

####Dependency Injection (DI)

DIの際は、Facadeではなく、use Illuminate\Http\Request;とする。

```php
<?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/です。

```bash
php artisan make:request HogeRequest
```
すると、以下のようなapp/Http/Request/HogeRequest.phpが生成されます。

```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
<?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
<?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
<?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して取得します。

```html
@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
```