You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中间件返回视图报错:Call to a member function setCookie() on null

Fixing "Call to a member function setCookie() on null" in Laravel User Active Check Middleware

Hey there, let's break down why this error is happening and how to fix it:

What's Causing the Error?

When you call auth()->logout(), Laravel does two key things: it invalidates the current user session and regenerates the CSRF token. Both of these actions require setting/updating cookies in the HTTP response. But right now, you're directly returning a View instance from the middleware. The problem is that the session middleware can't properly attach the necessary cookies to this view response, leading to the setCookie() on null error.

This approach follows Laravel's typical request-flow best practices and avoids cookie/session mishaps entirely by triggering a fresh request.

  1. Add a new route in routes/web.php:
Route::get('/account-disabled', function () {
    return view('layouts.frontend.pages.user-messages', [
        'message' => 'your account is disable'
    ]);
})->name('account.disabled');
  1. Update your middleware to redirect instead of returning a view directly:
class CheckUserActive {
    public function handle($request, Closure $next) {
        if (auth()->check() && auth()->user()->active == 0) {
            auth()->logout();
            // Optional: Flash a message to the session (more flexible than hardcoding)
            $request->session()->flash('error', 'your account is disable');
            
            return redirect()->route('account.disabled');
        }

        return $next($request);
    }
}
  1. Adjust your view to handle both hardcoded and flashed messages (optional but useful):
@extends('layouts.frontend.main')
@section('content')
<div class="content-wrapper">
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <div class="panel panel-default">
                    <div class="panel-body">
                        <p style="text-align: center;">
                            {!! session('error') ?? $message !!}
                        </p>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Solution 2: Return a Proper Response Instance

If you prefer not to redirect, you can manually wrap your view in a full Response object to ensure cookies are attached correctly:

use Illuminate\Http\Response;

class CheckUserActive {
    public function handle($request, Closure $next) {
        if (auth()->check() && auth()->user()->active == 0) {
            auth()->logout();
            $message = 'your account is disable';
            $viewContent = view('layouts.frontend.pages.user-messages', compact('message'))->render();
            
            return new Response($viewContent);
        }

        return $next($request);
    }
}

Quick Note on Middleware Order

Just double-check that your CheckUserActive middleware is placed after the StartSession middleware in your web middleware group (it already is in your provided config, so you're good here!). This ensures session handling is initialized before your middleware runs.

内容的提问来源于stack exchange,提问作者DolDurma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:29:17