我有以下问题,我想要共享一个数组到我的项目中的所有视图,所以我按照文档,它工作正常,但我想在服务提供程序启动函数中获取经过身份验证的用户,它总是返回null? 有什么建议 ?
这是我的代码
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public $myusers;
public function boot()
{
$origLat=\Auth::user()->lat;
$origLon=\Auth::user()->lng;
$dist=5;
$lon1=$origLon-$dist/cos(deg2rad($origLat))*73.2044736;
$lon2=$origLon+$dist/cos(deg2rad($origLat));
$lat1=$origLat-($dist/73.2044763);
$lat2=$origLat+($dist/73.2044763);
$id=\Auth::user()->id;
$pictures=User::find($id)->pictures;
$this->myusers = DB::table('users')->select(
DB::raw("*,
3956 * 2 *
ASIN(SQRT( POWER(SIN(($origLat- lat)*pi()/180/2),2)
+COS($origLat*pi()/180 )*COS(lat*pi()/180)
*POWER(SIN(($origLon-lng)*pi()/180/2),2)))*1.609344
as distance"
))
->where('users.id', '!=', \Auth::user()->id)
->whereBetween('lng',[$lon1,$lon2])
->whereBetween('lat',[$lat1,$lat2])
->having("distance", "<", "$dist")
->orderBy("distance")
->get();
view()->share('myusers', $this->myusers);
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
答案 0 :(得分:2)
不幸的是,此时Laravel应用程序请求生命周期的工作方式是,当执行boot
类的App\Providers\AppServiceProvider
方法时,会话尚未初始化(因为这是在中间件中完成的)在boot
方法之后执行。
由于身份验证系统需要会话才能获得经过身份验证的用户,因此在您的特定情况下,您无法在此处成功使用view()->share()
(尽管这是推荐的方法)。相反,您可以在中间件中使用替代方法。以下是您可以遵循的步骤:
1。通过运行此命令创建一个中间件类,我们称之为LoadUsers
:
php artisan make:middleware LoadUsers
2。这将在app/Http/Middleware/LoadUsers.php
中生成一个类。现在,您只需将代码从AppServiceProvider
移动到中间件的handle
方法:
class LoadUsers
{
public function handle($request, Closure $next)
{
// Your code that shares the data for all views goes here
return $next($request);
}
}
3. 接下来,您需要使用App\Http\Kernel
类注册中间件。如果要将中间件应用于使用该中间件的所有路由或创建特定组或路由中间件,可以将其从web
添加到$routeMiddleware
组。如果您想将其添加到web
:
protected $middlewareGroups = [
'web' => [
...
// Make sure to add this line is after the
// StartSession middleware in this list
\App\Http\Middleware\LoadUsers::class,
],
...
];
现在,您应该拥有可依赖于Auth::user()
的所有视图的正确共享数据。