2017-10-16 183 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

感謝您的幫助。我現在無法對此進行測試,但是當我在發生此問題的項目中需要做其他工作時,我會記住這一點。 –