どういうパターン?
ユーザの権限などがあり、ルートモデルバインディングでバインドされたモデルにアクセスする権限があるかどうかを確認するポリシーが存在するとき、
ポリシーに違反していない(アクセス権限がある)はずなのに、403エラーが発生する、みたいなパターン。
解決方法
ルートモデルバインディングしているモデルを、例え使わないとしても受け取ってください。
class StoreController extends Controller
{
public function index(Store $store): View
{
return view('user.store.index');
}
}
サンプルコード
/stores/{store}
には、ログイン中のユーザと店舗に関連が無いとアクセスできないようにポリシーを設定します。
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Store::class => StorePolicy::class,
];
// ...
}
class StorePolicy
{
use HandlesAuthorization;
public function view(User $user, Store $store)
{
return $user->stores->where('id', $store->id)->isNotEmpty();
}
// ...
}
Route::middleware(['can:view,store'])->group(function () {
Route::get('/stores/{store}', StoreController::class . '@index')->name('stores.index');
}
このような場合に、とりあえずviewの表示だけしよう!などという考えでこのように書くと、403になってしまいます。
class StoreController extends Controller
{
public function index(): View
{
return view('user.store.index');
}
}