如何在Laravel 5

时间:2017-06-19 13:26:36

标签: laravel laravel-5 laravel-5.4

我想挂钩模型事件以在删除模型后执行任务。我已将以下代码添加到我的模型中:

protected static function boot()
{
    parent::boot();

    static::deleted( 'static::removeStorageAllocation' );
}

而不是把我想要的逻辑运行在一个关闭的启动函数中,这对它来说似乎是一个非常难看的地方,我注意到在方法签名中它应该采用“\ Closure | string $ callback”是否有办法我可以像上面尝试的那样指定一个函数名吗?我似乎无法想出任何有用的东西。我尝试了很多组合:

'self::removeStorageAllocation'
'static::removeStorageAllocation'
'\App\MyModel::removeStorageAllocation'

我知道我可以只指定一个调用我的函数的闭包,但是我想知道$ callback的字符串形式是什么?

2 个答案:

答案 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']);
}