フォームリクエストとポリシー
バリデーションの記述をコントローラー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へ登録が不要