这是我的PostCategoriesController
课程的一部分:
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\PostCategory;
use Illuminate\Support\Facades\Auth;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Auth\Access\AccessDeniedHttpException;
class PostCategoriesController extends Controller
{
public function __construct()
{
try {
echo 'The try works.';
$this->authorizeResource(PostCategoriesController::class);
} catch (\Exception $err) {
// Never get here.
dd('The catch does not. We never see this...');
}
}
public function create()
{
// This works... but then I have to repeat it for every action...
try {
$this->authorize('create');
return view('admin.post-categories.create');
} catch (\Exception $err) {
//return redirect()->route('admin.welcome');
return 'You cannot create categories, sorry.';
}
}
}
问题特别在于方法authorizeResource()
,它抛出了异常:
Symfony \ Component \ HttpKernel \ Exception \ AccessDeniedHttpException此操作未经授权。
方法authorizeResource()
不在文档上,但我在其他帖子中看到了它,例如Laravel policy always false和Apply Policy to Resource Controller。它也是here。
PostCategoryPolicy
类只返回方法中的布尔值,例如:
public function update(User $user, PostCategory $postCategory)
{
return $user->has_role === 1;
}
那么,为什么我不能抓住那个例外?
答案 0 :(得分:4)
我遇到了同样的问题,基于我自己的要求,我应用了一个对我来说很好的特定解决方案,希望它也适合你
这更像是处理此异常的通用方法,而不是特定于控制器内的每个控制器或方法
请参阅此档案
/vendor/laravel/framework/src/Illuminate/Foundation/Exception/Handler.php
在此文件中,您将看到受保护的功能
protected function prepareResponse($request, Exception $e)
你需要在你自己的Handler.php文件中覆盖这个函数,该文件可以在
中找到/ {根} /app/Exceptions/Handler.php
只是覆盖这个函数并尝试处理Synfony Access Denied Exception,我只是复制粘贴整个代码并在最终返回之前添加我自己的小代码,以便其他所有工作都像以前一样工作,唯一改变的是如何处理AccessDenied异常
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
protected function prepareResponse($request, Exception $e)
if ($e instanceof AccessDeniedHttpException) {
// $this->unauthorized is a custom & local function that I created
// you can try doing dd('yes it works over here');
return $this->unauthorized($request, $e);
}
}
我只是试图向你解释这个概念,你可以替换这行
返回$ this-&gt;未经授权($ request,$ e);
使用您需要的任何类型的Laravel代码,例如重定向,dd等
希望这有帮助