Laravel 5.5,无法在构造函数

时间:2017-10-16 11:45:09

标签: laravel authorization

这是我的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 falseApply Policy to Resource Controller。它也是here

PostCategoryPolicy类只返回方法中的布尔值,例如:

public function update(User $user, PostCategory $postCategory)
{
    return $user->has_role === 1;
}

那么,为什么我不能抓住那个例外?

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等

希望这有帮助