Laravel5 Form Request Validationによるコントローラの軽量化

フォームのビジネスロジック(検証や保存)をコントローラに書くと、どうでも良いコードでコントローラが重くなってくる。フォームが複数ある場合、だいたい似たり寄ったりのコードが量産されていく。本エントリでは、Laravel5 の Form Request Validation によってコントローラからバリデーションロジックを完全分離する方法について記述する。

Form Request Validation – バリデーションの分離

流れは以下の通り。

  • App\Http\Requests\Requestクラスを派生し、ContactRequestクラスを作成する。
  • コントローラメソッドにて、App\Http\Requests\Requestクラスのインスタンスではなく ContractRequestクラスのインスタンスを受けるようにする。
  • コントローラメソッドに入ったときには既にContactRequestクラスによるバリデーションが完了していて、データが正しい前提で処理できる。

ContactRequestクラス、ContactRequestTraitクラスの例を以下に示す。

Form Request Validation – コントローラ側

ポイントは、storeメソッドの引数に ContactRequestヒントが渡されていること。sotreメソッドに入る前にContactRequestによりバリデーションが実行され、バリデーションに成功した時に限り、sotre()メソッドに入る。バリデーションが失敗すると、その前のアドレスにリダイレクトされる。コントローラから一切のバリデーションロジックを排除できた。

<?php

namespace App¥Http¥Controllers;
use App¥Http¥Requests¥ContactRequest;
use App¥Repositories¥ContactRepository;

class ContactController extends Controller
{
/**
/* @var ContactRepository
*/
protected $repository;

/**
/* @constructor
/* param ContactRepository $repository
*/
public function __construct(ContactRepository $repository)
{
$this->repository = $repository;
}

/*
*
*/
public function index()
{
...
}

/**
* @var ContactRequest $request
*
*/
public function store(ContactRequest $request)
{

}

}

シェアする

  • このエントリーをはてなブックマークに追加

フォローする