2017-10-16 184 views
1

处理政策/授权异常这是我PostCategoriesController类的一部分:Laravel 5.5,不能在构造函数

<?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; 
} 

那么,我为什么不能捕获该异常?

回答

3

我面临同样的问题,根据我自己的要求,我申请的是正常工作对我来说是特别的解决方案,希望它为你的作品以及

这更多的是一种通用的方法来处理这个异常,而不是具体到内部控制器每个控制器或方法

请参阅本文件

/vendor/laravel/framework/src/Illuminate/Foundation/Exception/Handler.php

这个文件你”内我会看到保护功能

protected function prepareResponse($request, Exception $e) 

你需要重写自己的Handler.php文件这一功能,可以内部

找到/{root}/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); 
    } 
} 

我只是试图解释你的概念,你可以代替线

回报$这个 - >未经授权($请求,$ E);

与任何类型的Laravel代码,你需要像重定向,DD等

希望这有助于

+0

感谢您的帮助。我现在无法对此进行测试,但是当我在发生此问题的项目中需要做其他工作时,我会记住这一点。 –