php trait 构造函数,php - Laravel在trait构造函数中传递参数 - SO中文参考 - www.soinside.com...

在模型的booting阶段,它在类中递归搜索导入的特征,并自动调用静态地使用boot{TraitNameHere}命名约定的方法。这证明模型中的特征不涉及Laravel的依赖注入循环。

为了实现这一点,您可以使用Laravel全局帮助程序在容器内加载存储的实例,例如外观App::make(DefinedKeyHere)。然后将分配的实例存储到静态属性中以使其保留,直到运行时结束,并且因为调用方法是static。

trait TimezoneTrait

{

protected static $userRepository;

protected static function bootTimezoneTrait()

{

static::$userRepository = \App::make(UserRepositoryInterface::class);

}

}

如果您当前正试图避免使用全局帮助程序,那么监听模型启动事件也很有帮助。 EventServiceProvider中的示例,

Event::listen('eloquent.booting:*', function (Model $model) {

$model->setUserRepository($this->app[UserRepositoryInterface::class]);

});

然后特征是,

trait TimezoneTrait

{

protected static $userRepository;

public function static setUserRepository(UserRepositoryInterface $userRepository)

{

static::$userRepository = $userRepository;

}

}

请注意,我将setUserRepository定义为静态,但您也可以将其定义为非静态。

为了进一步扩展模型事件,模型在执行相关操作时会触发几个事件。

来自Laravel 5.5的示例事件,

public function getObservableEvents()

{

return array_merge(

[

'creating', 'created', 'updating', 'updated',

'deleting', 'deleted', 'saving', 'saved',

'restoring', 'restored',

],

$this->observables

);

}

以及其实例化(也是未序列化的)booting和booted时触发的其他两个默认事件。以及用于触发事件的方法,请注意事件名称。

protected function fireModelEvent($event, $halt = true)

{

// ...

return ! empty($result) ? $result : static::$dispatcher->{$method}(

"eloquent.{$event}: ".static::class, $this

);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值