“试图获取非对象的属性“标头”” Middleware \ VerifyCsrfToken.php:180

时间:2019-04-18 13:17:11

标签: laravel laravel-5 eloquent

我编写了自定义中间件,但是执行该中间件时会出现错误。 中间件:

namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
use App\Employee;

class CheckConfirm
{
public function handle($request, Closure $next)
{
    if(Auth::check())          
    {
        $id = Auth::id();        
        $empl = Employee::where('user_id','=', $id)->get();
        if($empl->isEmpty())
        {
            return route('confirm');                    
        }
        else
        {                
            dump($empl);
            return $next($request);
        }
    }
    else
    {
        return route('login');
    }
}
}

当我尝试这样的事情时:

if($empl===null)
   {
      return route('confirm');                    
   }

сondition根本不起作用。 在这种情况下,数据库查询将成功执行。 Here is the error page with dump

3 个答案:

答案 0 :(得分:2)

您的中间件必须返回Response对象或$next($request)。按照书面规定,当未登录或$empl为空时,中间件只是返回一个字符串,而不是重定向。

将您的退货更新至:

return redirect()->route('confirm');

return redirect()->route('login');

分别。

答案 1 :(得分:1)

很难修复,我尝试使用App \ Http \ Middleware \ VerifyCsrfToken :: except来解决,但是不起作用。

我对此问题的解决方案是使用App \ Exception \ Handler :: render方法创建到另一条路由的重定向。

    <div id="companiesGrid" class="col" style="margin-top:15px">

      <angular-slickgrid appSlickgridTour gridId="compGridList" [columnDefinitions]="columnDefinitions"
        [gridOptions]="gridOptions" [dataset]="dataset" (onAngularGridCreated)="angularGridReady($event)">
      </angular-slickgrid>

    </div>

答案 2 :(得分:0)

替换此行:

$empl = Employee::where('user_id','=', $id)->get();
        if($empl->isEmpty()){ ... }

与此:

$empl = Employee::where('user_id', $id)->first();
        if($empl){ ... }

然后在每行的dd()处查看失败之处。可能缺少csrf令牌,或者用户未登录。