124
129

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel5でRequest各種(POST/GET値のやりとり)

Last updated at Posted at 2015-04-09

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
124
129
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
124
129

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?