Laravelでフォームリクエストを使ってコントローラーにバリデーションをする
262 回閲覧されました
みなさんこんにちは、jonioです。
今回はLaravelでフォームリクエストを使ってコントローラーにバリデーションをかけて値を保存する方法を解説します。
目次
Laravelのバージョン
8です
注意点
必要な部分のコードしか解説しません。
実装の流れ
以下になります。
- モデルに保存する為の記述をする
- コントローラーでモデルを使う為の記述をする
- フォームリクエストを作成
- コントローラーでフォームリクエストを使用
実際にやってみます。
モデルに保存する為の記述をする
コードを下記にします。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Demo extends Model
{
use HasFactory;
protected $fillable = [
'name',
];
function DemoStore($request){
Demo::create([
'name' => $request->name,
]);
}
}
コントローラーでモデルを使う為の記述をする
コードを下記にします。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Demo;
class TicketController extends Controller
{
public function store(Demo $demo)
{
$demo->DemoStore($request);
return back();
}
}
フォームリクエストを作成
下記のコマンドを叩きます。
php artisan make:request DemoRequest
「Laravelのプロジェクト > app > Http > Requests」の下の階層に「DemoRequest.php」が作成されます。
DemoRequest.phpを下記の記述に変更します。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class TicketRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true; //falseをtrueに変える
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required|max:255', //この行を追加
];
}
}
16行目はデフォルトがfalseになっているのでtureに変更します。
27行目にバリデーションを書きます、コントローラーに書く場合と同じです。
コントローラーでフォームリクエストを使用
コントローラーにフォームリクエストを適用します。
コントローラーのコードを下記にします。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Demo;
use App\http\Requests\DemoRequest; //この行を追加
class TicketController extends Controller
{
public function store(Demo $demo, DemoRequest $request) //「, DemoRequest $request」を追加
{
$demo->DemoStore($request);
return back();
}
}
作成したフォームリクエストを使う為に7行目を追加します。
11行目のDemoRequestはDemoRequest.phpと同じ名前にします。
これでバリデーションが適用されます。
アクションでバリデーションを分ける場合
今のままだとコントローラーの全てのアクションにバリデーションが適用されますがアクションによって分けたい場合が出てくるはずです。
特定のアクションで適用させたい場合はDemoRequest.phpを下記にします。
//元々が↓
public function rules()
{
return [
'name' => 'required|max:255',
];
}
//元々が↑
//↓に変更
public function rules()
{
$rules = [
'name' => 'required|max:255',
];
if ($this->action == 'アクション名') {
$rules['content'] = 'required';
}
return $rules;
}
//↑に変更
19行目の「required」の部分にバリデーションのルールを書けばいいです。
これで完成です。