在 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 方法会在模型初始化时自动调用,无需手动调用
通过使用这种方式,我们可以让代码更加模块化和可复用,同时保持代码的整洁性。