Laravel中间件返回(试图获取非对象的属性“标头”)错误

时间:2019-02-12 05:47:31

标签: laravel 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');
        // }
    }
}

使用中间件的资源路由

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

我遇到错误:

  

(尝试获取非对象的属性“标头”)。

如何解决?

5 个答案:

答案 0 :(得分:0)

尝试添加一个.块,当不满足您的else条件时返回该块:

if

答案 1 :(得分:0)

在中间件中,处理所有情况并相应地返回重定向或中止很重要。

要允许系统继续处理前面的请求时,您执行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了解更多选项。

答案 2 :(得分:0)

只需在中间件中使用以下内容:RedirectIfAuthenticated

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我在创建管理仪表板页面时也遇到了同样的问题,但在“if-else”条件后添加 return $next($request); 行后,我的问题得到了解决,

这是我的代码:

public function handle(Request $request, Closure $next)
    {
        if($request->session()->has('ADMIN_LOGIN')){
        #
        }else{
            $request->session()->flash('error', 'Access Denied');
            return redirect('admin');
        }
        return $next($request);
    }