phplaravellaravel-5.6

Laravel return view on middleWare


in laravel i'm trying to check user active column and if its 0 then must be show simple view as your account is disable, after implementing below codes i get this error:

Call to a member function setCookie() on null

my middleware:

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

kernel.php:

...
    protected $middlewareGroups = [
        'web' => [
            ...
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\CheckUserActive::class,

        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];
...

user-messages.blade.php:

@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;">
                                {!! $message !!}
                            </p>
                        </div>
                    </div>
                </div>
            </div>
        </div>

    </div>
@endsection

Solution

  • You shouldn't use middleware to return a view, rather use it to redirect to a route and then return a view from your controller.

    In your middleware:

    use Auth;
    
    class CheckUserActive
    {
        public function handle($request, Closure $next)
        {
            if (Auth::check()) {
                if (Auth::User()->active == 0) {
                    Auth::logout();
                    return redirect()->route('redirect-route');
                }
            }
            return $next($request);
        }
    }
    

    Create a new named route:

    Route::get('/', [
            'as' => 'redirect-route',
            'uses' => 'PageController@redirectFunction',
        ]);
    

    Now create a function in your controller:

    public function redirectFunction() 
    { 
        $message = 'your account is disable';
        return view('layouts.frontend.pages.user-messages', compact('message'));
    }