我已经尝试将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()
{
//
}
}
答案 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);
}
}