Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした