8
votes

Erreur de retour du middleware Laravel (tentative d'obtention des 'en-têtes' de propriété d'un non-objet)

J'obtiens une erreur lorsque j'encapsule une route de ressources vers mon middleware personnalisé

Mon middleware final:

Route::resource('new-order', 'BackendController')->middleware('officer');

La route de la ressource utilisant le middleware:

<?php

 namespace App\Http\Middleware;

 use Closure;
 use Auth;

class Officer
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (Auth::check() && Auth::user()->role == 'title_officer') {
            return $next($request);
        }
        // elseif (Auth::check() && Auth::user()->role == 'agent') {
        //     return redirect('/agent');
        // }
        // else {
        //     return redirect('/customer');
        // }
    }
}

J'obtiens une erreur:

(Essayer d'obtenir les 'en-têtes' de propriété d'un non-objet).

Comment y remédier?


1 commentaires

à peu près @TravisBritz


4 Réponses :


0
votes

essayez d'ajouter un bloc else qui revient lorsque votre condition if n'est pas remplie:

public function handle($request, Closure $next)
    {
        if (Auth::check() && Auth::user()->role == 'title_officer') {
            return $next($request);
        }else{
           return back();
        }
    }


1 commentaires

le bloc else manquant créait le problème, mais maintenant je l'ai corrigé. Merci



16
votes

Dans le middleware, il est important de gérer tous les cas et de renvoyer les redirections en conséquence ou d'abandonner.

Vous retournez $ next ($ request); lorsque vous voulez permettre au système de continuer à traiter la demande à l'avance.

Cependant, si dans le cas si ( Auth :: check () && Auth :: user () -> role == 'title_officer') échoue, vous n'avez pas mentionné ce que le système doit faire.

Vous pouvez être abort (404) si vous ne voulez pas afficher la page comme disponible ou peut-être abandonner (403) pour un accès interdit.

public function handle($request, Closure $next)
    {
        if (Auth::check() && Auth::user()->role == 'title_officer') {
            return $next($request);
        }
        abort(403);
    }

Mais assurez-vous de ne pas ajouter de cas qui fera une boucle infinie. Veuillez consulter la documentation pour plus d'options.


0 commentaires

0
votes

utilisez simplement quelque chose comme ceci dans le middleware: RedirectIfAuthenticated

public function handle($request, Closure $next, $guard = null)
{
     if (Auth::guard($guard)->check()) {
         // your condition
         return redirect('the route name');
     }
}


0 commentaires

0
votes

En retard mais .. Cela m'arrive lorsque la colonne dans DB était nulle.


0 commentaires