【问题标题】:Laravel middleware returning (Trying to get property 'headers' of non-object) errorLaravel 中间件返回(尝试获取非对象的属性“标题”)错误
【发布时间】:2019-02-12 05:47:30
【问题描述】:

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

我的中间件:

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

我收到错误:

(试图获取非对象的属性“标题”)。

如何解决?

【问题讨论】:

    标签: laravel middleware


    【解决方案1】:

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

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

    但是,如果if (Auth::check() &amp;&amp; Auth::user()-&gt;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】:

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

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

      【讨论】:

      • 太棒了!我错过了重定向助手。
      【解决方案3】:

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

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

      【讨论】:

      • 缺少的 else 块造成了问题,但现在我修复了它。谢谢
      【解决方案4】:

      我遇到了这个错误。在我的控制器中,我有

      return route('dashboard')

      而不是

      return redirect()-&gt;route('dashboard')

      那应该可以解决它

      【讨论】:

        【解决方案5】:

        迟到了,但是当数据库中的列为空时,我会遇到这种情况。

        【讨论】:

          猜你喜欢
          • 2018-09-26
          • 1970-01-01
          • 1970-01-01
          • 2021-09-21
          • 2016-04-15
          • 1970-01-01
          • 2018-07-04
          • 1970-01-01
          • 2016-06-13
          相关资源
          最近更新 更多