【问题标题】:Share data to all views in laravel5.2将数据共享到 laravel 5.2 中的所有视图
【发布时间】:2016-04-13 22:11:20
【问题描述】:

我有以下问题,我想将一个数组共享给我项目中的所有视图,所以我按照文档进行操作,它工作正常,但我想在服务提供者启动功能中获取经过身份验证的用户,它总是返回 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()
  {
    //
  }
}

【问题讨论】:

  • 我已经分享了上面的代码有什么建议吗?
  • 什么返回null? Auth::user()-&gt;id?你试过Request::user()-&gt;id,尝试 var 转储Auth::user(),你得到了什么?在将其发送到视图之前,您可能应该添加一个检查以查看它们是否经过身份验证。
  • 我已经尝试了所有这些,它总是返回一个 null 。

标签: laravel-5 laravel-5.2


【解决方案1】:

不幸的是,此时 Laravel 应用程序请求生命周期的工作方式是,当执行 App\Providers\AppServiceProvider 类的 boot 方法时,会话尚未初始化(因为这是在之后执行的中间件中完成的boot 方法)。

由于身份验证系统需要会话才能获得经过身份验证的用户,因此在您的特定情况下,您不能在那里成功使用view()-&gt;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 类注册中间件。如果要将中间件应用到使用该中间件的所有路由或创建特定组或路由中间件,则可以将其添加到 $routeMiddleware 中的 web 组。因此,如果您想将其添加到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() 的视图的正确共享数据。

【讨论】:

  • 谢谢! ,你真棒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多