Igor Q.
Igor Q.

Reputation: 707

Auth::check returns false in AppServiceProvider

I have tried injecting the Guard contract into the constructor, I have tried moving around. But when a user is logged in - Auth::check() returns false.

In other files (Except 1 global middleware) Auth::check() works correctly. In the middleware - moving Auth Check to the top helped alleviate the issue. In this case - it isn't working.

Additional information: This app has been upgraded from 4.2 . Previously it used Confide.

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{

        /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        if(Auth::check())
        {
            $user = Auth::user();
            $messages=Message::where('read',0);
            $messages->where(function ($query) use ($user) {
                $query->where('to',$user->id)->orwhere('from',$user->id);
            });
            $message_unread= $messages->count();

            $new_notifications= Notification::where('user_id',$user->id)->where('viewed',0)->count();            
        }
        else
        {
            $message_unread=0;
            $new_notifications=8888888;

//its 888888 for testing purposes.

        }

        view()->share(([
            'message_unread'=>$message_unread,
            'new_notifications'=>$new_notifications
        ]));
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Upvotes: 2

Views: 1200

Answers (3)

Jannie Theunissen
Jannie Theunissen

Reputation: 30164

Apart from using a view composer, you could also use middleware which is processed after the session variables have been loaded:

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Guard;

class SetViewVariables
{
    protected $auth;

    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    public function handle($request, Closure $next)
    {
        $user = $this->auth->user();
        view()->share('user', $user);

        return $next($request);
    }

}

Upvotes: 0

Imtiaz Pabel
Imtiaz Pabel

Reputation: 5443

You need to use auth in at the top of the serviceprovider class

use Auth;

Instead of

use Illuminate\Support\Facades\Auth;

Upvotes: 0

Andrii Mishchenko
Andrii Mishchenko

Reputation: 2694

You should move this code to controller layer. boot method of Laravel's ServiceProviders serves for bootstrapping the services, not implementing busines logic.

Upvotes: 1

Related Questions