初めてのLaravel 5.6 : (18) Form Request

前回は Form の入力値チェックを行いました。今回は、Form Request という機能を使って、入力値のチェック方法を修正します。

Form Request の作成

artisan を使って、Article 用の Form Request を生成します。

php artisan make:request ArticleRequest

app/Http/Requests/ArticleRequest.php が作成されました。

<?php // app/Http/Requests/ArticleRequest.php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ArticleRequest extends FormRequest
{
    public function authorize()
    {
        return false;
    }

    public function rules()
    {
        return [
            //
        ];
    }
}


ArticleRequest.php の編集

Article 用に内容を編集します。

<?php
// ...

class ArticleRequest extends Request {

    public function authorize()
    {
        return true;  // ①
    }

    public function rules()
    {
        return [  // ②
            'title' => 'required|min:3',
            'body' => 'required',
            'published_at' => 'required|date',
        ];
    }
}

① authorize メソッドではリクエストに対する権限を設定します。例えば、現在ログイン中のユーザに権限が無ければ、false を返します。今のところ誰でも Articles データを追加できるように true を返しておきます。

② rules メソッドでは、バリデーションルールを返します。


Controller

ArticlesController.php の store メソッドで ArticleRequest を使うように修正します。

<?php
// app/Http/Controllers/ArticlesController.php

use App\Http\Requests\ArticleRequest;

// ...

class ArticlesController extends Controller {

    // ...

    public function store(ArticleRequest $request) {  // ①
        // ここでの validate が不要になった

        Article::create($request->validated());
        return redirect('articles');
    }
}

① store メソッドで受け取るクラスを Illuminate\Http\Request から App\Http\Requests\ArticleRequest に変更しました。これだけで、今まで store メソッド内で行っていた、validate が不要になります。エラーがあった時の前画面へのリダイレクトも ArticleRequest が行ってくれます。コントローラがスリムになり、超クールです。

念の為、いままで通り入力チェックが効くか、動作確認をお忘れなく

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中