Auth :: check在AppServiceProvider中返回false

时间:2016-01-18 20:58:31

标签: php laravel

我已经尝试将Guard合同注入构造函数中,我已经尝试过移动。但是当用户登录时 - Auth :: check()返回false。

在其他文件中(除1个全局中间件外)Auth :: check()正常工作。 在中间件中 - 将Auth Check移动到顶部有助于缓解问题。在这种情况下 - 它不起作用。

其他信息:此应用已从4.2升级。以前它使用了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;

//其888888用于测试目的。

        }

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

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

3 个答案:

答案 0 :(得分:1)

您应该将此代码移动到控制器层。 Laravel的ServiceProviders的boot方法用于引导服务,而不是实现业务逻辑。

答案 1 :(得分:0)

您需要在serviceprovider类的顶部使用auth in

use Auth;

而不是

use Illuminate\Support\Facades\Auth;

答案 2 :(得分:0)

除了使用视图编辑器之外,您还可以使用在加载会话变量后处理的中间件:

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

}