FormRequestで入力値を補正を以前紹介しましたが、今度はちょっと違う補正の紹介です。何が違うというと、今度はバリデーションの後でなくバリデーション前に入力値を変えます。入力項目とDBに保存する項目の形態が違うときにとても便利です。とりあえず、それが必要なケースの説明から。
まず、DBに保存するのは、start_at(開始日時)とend_at(終了日時)の日時タイプ(mysqlならDATETIME)の2つ項目とします。しかし、両方の項目ともに日付は同じという仮定。いくつかのUIのバリエーションが考えられますが、私が考えたのは以下。

つまり、入力項目は、日付、開始時刻(数字)、終了時刻(数字)の3つの入力項目です。
日付はjquery-uiでカレンダーからの選択も可能(以下)であるし、時刻もドロップダウン、とすることもできますね。

画面から入ってくるのは、date, start_hr, end_hrの3つの値なのですが、さて、これらの入力値をバリデーションにかけて、DBには、start_atとend_atの2つの項目に保存するには、どうしたらよいでしょうか?
そこで登場するのが、FormRequestです。
まず、以下のコマンドでFormRequestファイルを、app/Http/Requestsのディレクトリに作成します。
$ php artisan make:request EventRequest
作成されたファイルを以下のように編集します。
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class EventRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'start_at' => 'required|date|date_format:Y-m-d H:i:s',
'end_at' => 'required|date|date_format:Y-m-d H:i:s|after:start_at',
];
}
public function messages()
{
return [
'date_format' => '不正な日時のフォーマットです',
];
}
public function attributes()
{
return [
'start_at' => '開始日時',
'end_at' => '終了日時',
];
}
/**
* Prepare the data for validation.
*
* @return void
*/
protected function prepareForValidation()
{
// ここでDBに収納する項目を作成
$this->merge([
'start_at' => sprintf('%s %02d:00:00', $this->date, $this->start_hr),
'end_at' => sprintf('%s %02d:59:59', $this->date, $this->end_hr),
]);
}
}
ここ、preparedForValidation()の関数において、入力値を、start_atとend_atの入力値に変換しています。DBではそれらの項目はDateTimeのタイプなので、時間だけでなく分や秒も足すこと必要です。
コントローラのメソッドでは、以下のようにコールします。store()の引数が、通常のRequestでなくEventRequestとなっていることに注意を。
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Http\Requests\EventRequest;
class EventController extends Controller
{
...
/**
* Store
*
* @param \App\Http\Requests\EventRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(EventRequest $request)
{
dd($request->all());
...
実行すると、dd()の出力は、
array:6 [▼ "_token" => "npq1EPLTVvthufpgQiIpXIkxpwMPEsEEIBIzYf5A" "date" => "2020-10-08" "start_hr" => "8" "end_hr" => "17" "start_at" => "2020-10-08 08:00:00" "end_at" => "2020-10-08 17:59:59" ]メルマガ購読の申し込みはこちらから。
