記事の投稿、更新のバリデーションとポリシー

フォームリクエストとポリシー

  • laravel

フォームリクエストの作成と編集と使用

バリデーションの記述をコントローラー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' => '本文',
         ];
      }
   } 
 

フォームリクエストの使用

コントローラーのstoreメソッド部分

 public function store(モデル名Request $request, Article $article)
    {
     //==========例==========
        $article->title = $request->title;
        $article->body = $request->body;
        $article->save();
        return redirect()->route('articles.index');
    }
 
  • 余談 引数の型宣言
    Laravelのコントローラーはメソッドの引数で型宣言を行うと、そのクラスのインスタンスが自動で生成されてメソッド内で使える
    $article = new Article(); を中で書かなくて良い
  • 余談2 fillableの利用(マスアサイメント)
    モデルへの代入処理をプロパティの数だけ羅列しなく済む
    不正なリクエストでテーブルが更新されることを防ぐ

fillableの利用

コントローラーの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へ登録が不要

  • モデルがappディレクトリ配下にある
  • ポリシーがapp/Policesディレクトリ配下にある
  • ポリシー名がモデル名Policyという名前である

Home