フォームリクエストとポリシー
バリデーションの記述をコントローラーstore から切り離せる
php artisan make:request モデル名Request
app/Http/Requests/モデル名Requestが作成される
作成された名前.phpを編集
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ArticleRequest extends FormRequest
{
public function authorize()
{
return true; //-- この行を変更
}
public function rules()
{
return [
//==========例==========
'title' => 'required|max:50',
'body' => 'required|max:500',
];
}
public function attributes()
{
return [
//==========例==========
'title' => 'タイトル',
'body' => '本文',
];
}
}
authorizeメソッド
falseのままだとステータスコード403レスポンス
ユーザー自身の書いた記事かはポリシー機能使う
フォームリクエストの認可
rulesメソッド
バリデーションのルールを定義、連想配列形式
バリデーションロジック
使用可能なバリデーションルール
attributesメソッド
メッセージに表示される項目名
日本語で表示されるようにしている
他の画面でのバリデーションエラーメッセージに影響を与えない
コントローラーのstoreメソッド部分
public function store(モデル名Request $request, Article $article)
{
//==========例==========
$article->title = $request->title;
$article->body = $request->body;
$article->save();
return redirect()->route('articles.index');
}
コントローラーのstoreメソッド内
//=fillメソッドにallメソッドで取得した全ての配列を渡す(例)== $article->fill($request->all());
モデルのクラス内
protected $fillable = [
//==指定しておいたプロパティだけが代入される===
'title',
'body',
];
ポリシーの生成
ユーザー自身の書いた記事のみ編集、削除ができる(不正なパラメーター操作を防ぐ)
php artisan make:policy モデル名Policy --model=モデル名
app/Policies/モデル名Policy.phpが作成される
作成された名前.phpを編集
class ArticlePolicy
{
use HandlesAuthorization;
public function viewAny(?User $user) //--例?で未ログインユーザー考慮
{
return true;
}
public function view(?User $user, Article $article) // 例?で未ログインユーザー考慮
{
return true;
}
public function create(User $user)
{
return true; //-- この行を変更
}
public function update(User $user, Article $article)
{
return $user->id === $article->user_id; //-- 例
}
public function delete(User $user, Article $article)
{
return $user->id === $article->user_id; //-- 例
}
// 略
}
viewAny / viewメソッドはそれぞれコントローラーのindexメソッドshowアクメソッドに対応
createメソッドはコントローラーのcreate/storeメソッドに対応
作成したポリシーをコントローラーで使用する
// 略 例
class ArticleController extends Controller
{
//==__constructメソッドで呼び出さなくても必ず実行=
public function __construct()
{
$this->authorizeResource('App/Article', 'article');
}
//==========ここまで追加==========
// 略
public function index()
{
// 略
}
authorizeResourceメソッド
ポリシーの登録
以下の条件を満たしている場合、AuthServiceProviderへ登録が不要