Laravel 中间件返回(尝试获取非对象的 属性 'headers')错误

Laravel middleware returning (Trying to get property 'headers' of non-object) error

当我将资源路由包装到我的自定义中间件时,我收到 错误

我的中间件:

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

资源路由使用中间件:

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

我遇到错误:

(Trying to get property 'headers' of non-object).

如何解决?

当您的 if 条件不满足时,尝试添加一个 else 块 returns:

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

在中间件中,重要的是处理所有情况,return 相应地重定向或中止。

当您想让系统继续处理前面的请求时,您可以return $next($request);

但是,如果万一if (Auth::check() && Auth::user()->role == 'title_officer')条件失败,你没有提到系统应该做什么。

如果您不想将页面显示为可用,您可以 abort(404) 或者 abort(403) 禁止访问。

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

但请确保您没有添加会造成无限循环的案例。请检查 documentation 以获得更多选项。

只需在中间件中使用类似这样的东西:RedirectIfAuthenticated

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

晚了但是.. 当 DB 中的列为空时,这发生在我身上。

我有这个错误。在我的控制器中我有

return route('dashboard')

而不是

return redirect()->route('dashboard')

这应该可以解决它