2017-10-16 14 views
1

Cela fait partie de ma classe PostCategoriesController:Laravel 5.5, ne peut pas gérer la politique/l'autorisation exception sur le constructeur

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

Le problème est précisément la méthode authorizeResource(), qui jette l'exception:

Symfony \ Component \ HttpKernel \ Exception \ AccessDeniedHttpException Cette action n'est pas autorisée.

La méthode authorizeResource() pas sur les documents mais je le vois recommandé dans certains autres postes, comme Laravel policy always false et Apply Policy to Resource Controller par exemple. Il est également here.

La classe PostCategoryPolicy retourne juste booléens de méthodes, il des choses comme:

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

Alors, pourquoi je ne peux pas attraper cette exception?

Répondre

3

Je faisais face à la même question, en fonction de ma condition j'ai appliqué une solution particulière qui fonctionne bien pour moi, espérons que cela fonctionne aussi bien pour vous

Ceci est plus d'une manière générique pour gérer cette exception, plutôt que spécifiques à chaque contrôleur ou méthode dans le contrôleur

S'il vous plaît se référer à ce fichier

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

dans ce fichier, vous » je verrai une fonction protégée

protected function prepareResponse($request, Exception $e) 

vous devez remplacer cette fonction dans votre propre fichier Handler.php qui peut être trouvé à l'intérieur

/{root}/app/Exceptions/Handler.php

juste override cette fonction et essayer de gérer Synfony Access Denied Exception, j'ai simplement copié collé le code entier et ajouté mon propre petit code juste avant le retour final pour que tout le reste fonctionne comme il fonctionnait plus tôt, la seule chose qui change est la façon dont l'exception AccessDenied est gérée

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

J'ai simplement essayé de vous expliquer le concept, vous pouvez remplacer la ligne

retour $ this-> non autorisés (demande de $, $ e);

avec tout type de code Laravel dont vous avez besoin, comme redirect, dd etc

Hope this helps

+0

Merci pour l'aide. Je ne serai pas en mesure de tester cela maintenant, mais je le garderai à l'esprit lorsque j'ai d'autres travaux à faire dans le projet où ce problème s'est produit. –