Laravel 5.8:如何在全局范围的 apply 方法中解析 auth()-user()

作者:编程家 分类: laravel 时间:2025-07-22

Laravel 5.8:如何在全局范围的 apply 方法中解析 auth()->user()?

在Laravel 5.8中,我们经常会遇到需要在全局范围内访问当前登录用户的情况。幸运的是,Laravel提供了一个简单而有效的方法来实现这个目标。在本文中,我们将讨论如何在全局范围的apply方法中解析auth()->user()。

理解全局范围的apply方法

在Laravel中,全局范围的apply方法是一个非常强大的功能。它允许我们在查询构建器中应用全局条件,这些条件将在每个查询中自动应用。这使我们能够在整个应用程序中共享一些常用的查询逻辑,而无需在每个查询中手动添加。

解析auth()->user()

通常情况下,我们可以在控制器或视图中使用auth()->user()来访问当前登录用户的信息。但是,在全局范围的apply方法中,我们无法直接使用这个函数。为了解决这个问题,我们需要使用Laravel的服务容器来解析auth()->user()。

要在全局范围的apply方法中解析auth()->user(),我们需要创建一个服务提供器。服务提供器是Laravel中管理服务的重要组件之一。我们可以使用Artisan命令来生成一个新的服务提供器:

php artisan make:provider UserProvider

生成的UserProvider类将位于app/Providers目录中。接下来,我们需要在服务提供器的register方法中添加以下代码:

php

use Illuminate\Support\Facades\Auth;

public function register()

{

$this->app->singleton('currentUser', function ($app) {

return Auth::user();

});

}

在这里,我们使用Auth门面类来获取当前用户,并将其绑定到服务容器中的currentUser键。通过将其绑定为单例,我们可以确保每次解析时都会获得相同的用户实例。

接下来,我们需要在UserProvider的boot方法中添加以下代码:

php

use Illuminate\Support\Facades\View;

public function boot()

{

View::composer('*', function ($view) {

$view->with('currentUser', $this->app->make('currentUser'));

});

}

在这里,我们使用View门面类的composer方法来注册一个视图合成器。该合成器将为每个视图共享一个名为currentUser的变量,并将其值设置为从服务容器中解析的当前用户。

案例代码

现在,让我们通过一个简单的例子来演示如何在全局范围的apply方法中解析auth()->user()。

首先,让我们创建一个新的模型类User,该类将代表我们的用户:

php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model

{

protected $fillable = ['name', 'email', 'password'];

}

然后,在我们的服务提供器UserProvider中,让我们假设我们有一个全局范围的apply方法,该方法将应用于所有的查询构建器。在这个方法中,让我们假设我们想要限制查询结果只包含当前登录用户的数据:

php

namespace App\Providers;

use Illuminate\Support\Facades\Auth;

use Illuminate\Support\Facades\View;

use Illuminate\Support\ServiceProvider;

class UserProvider extends ServiceProvider

{

public function register()

{

$this->app->singleton('currentUser', function ($app) {

return Auth::user();

});

}

public function boot()

{

View::composer('*', function ($view) {

$view->with('currentUser', $this->app->make('currentUser'));

});

}

}

现在,我们可以在所有的查询构建器中使用全局范围的apply方法,并可以访问auth()->user()。例如,让我们假设我们有一个名为User的模型类,该类对应于users数据库表。我们可以在模型类中添加一个全局范围的apply方法,以限制查询结果只包含当前登录用户的数据:

php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model

{

protected $fillable = ['name', 'email', 'password'];

protected static function boot()

{

parent::boot();

static::addGlobalScope('current_user', function ($query) {

$currentUser = app('currentUser');

$query->where('user_id', $currentUser->id);

});

}

}

在上面的代码中,我们使用app('currentUser')来访问当前登录用户的实例,并将其ID用作查询条件。这将确保查询结果只包含与当前用户相关的数据。

通过使用Laravel的服务容器,我们可以在全局范围的apply方法中解析auth()->user(),以便在整个应用程序中访问当前登录用户的信息。通过创建一个服务提供器,并将用户实例绑定到服务容器中,我们可以轻松地在查询构建器中使用全局范围的apply方法,并应用与当前用户相关的查询条件。

希望本文对您在Laravel 5.8中解析auth()->user()有所帮助!