我想挂钩模型事件以在删除模型后执行任务。我已将以下代码添加到我的模型中:
protected static function boot()
{
parent::boot();
static::deleted( 'static::removeStorageAllocation' );
}
而不是把我想要的逻辑运行在一个关闭的启动函数中,这对它来说似乎是一个非常难看的地方,我注意到在方法签名中它应该采用“\ Closure | string $ callback”是否有办法我可以像上面尝试的那样指定一个函数名吗?我似乎无法想出任何有用的东西。我尝试了很多组合:
'self::removeStorageAllocation'
'static::removeStorageAllocation'
'\App\MyModel::removeStorageAllocation'
我知道我可以只指定一个调用我的函数的闭包,但是我想知道$ callback的字符串形式是什么?
答案 0 :(得分:2)
你可以传递一个匿名函数:
static::deleted(function() {
static::removeStorageAllocation();
});
要知道$ callback的字符串表示形式,您可以查看已删除的源代码:
/**
* Register a deleted model event with the dispatcher.
*
* @param \Closure|string $callback
* @param int $priority
* @return void
*/
public static function deleted($callback, $priority = 0)
{
static::registerModelEvent('deleted', $callback, $priority);
}
您将看到它正在注册一个事件监听器:
/**
* Register a model event with the dispatcher.
*
* @param string $event
* @param \Closure|string $callback
* @param int $priority
* @return void
*/
protected static function registerModelEvent($event, $callback, $priority = 0)
{
if (isset(static::$dispatcher))
{
$name = get_called_class();
static::$dispatcher->listen("eloquent.{$event}: {$name}", $callback, $priority);
}
}
因此,$ callback最终用作监听器。字符串表示很可能是侦听器类的名称,而不是方法。
答案 1 :(得分:1)
在模型上创建受保护或公共静态函数(私有不起作用):
protected static function myStaticCallback($model)
{
// Your code
}
然后使用数组为回调[class,function]:
添加引导方法到模型中protected static function boot()
{
parent::boot();
static::creating(['MyModel', 'myStaticCallback']);
}