戏里戏外

Laravel 中使用 Trait 的 booted 方法

2024-10-31#Laravel#Eloquent

在 Laravel 中,经常需要在模型中复用一些通用的功能。

虽然可以通过继承来实现,但使用 Trait 往往是更好的选择。

本文将介绍如何在 Laravel 中正确使用 Trait 的 booted 方法。

Trait 中的 booted 方法命名规则

在 Laravel 中,如果要在 Trait 中使用 booted 方法,需要遵循特定的命名规则:booted{TraitName}。例如:

trait Multitenancy
{
    public static function bootMultitenancy()
    {
        // boot 逻辑
    }
}

实际应用示例

以下是一个多租户系统的示例:

trait Multitenancy 
{
    public static function bootMultitenancy()
    {
        // 检查是否有已认证用户
        if (auth()->check()) {
            // 创建记录时自动设置 user_id
            static::creating(function ($model) {
                $model->user_id = auth()->id();
            });

            // 添加全局作用域,只查询当前用户的数据
            static::addGlobalScope('user_id', function (Builder $builder) {
                $builder->where('user_id', auth()->id());
            });
        }
    }
}

在模型中使用

将 Trait 添加到模型中:

use App\Traits\Multitenancy;

class Post extends Model
{
    use Multitenancy;
}

现在,当你查询数据时,会自动只返回当前认证用户的数据:

$posts = Post::all(); // 只返回当前用户的文章

注意事项

  • Trait 的 booted 方法必须是静态方法(static)
  • 方法名必须遵循 booted{TraitName} 的格式
  • booted 方法会在模型初始化时自动调用,无需手动调用

通过使用这种方式,我们可以让代码更加模块化和可复用,同时保持代码的整洁性。