Laravel 5.8 同步/附加/分离事件

Dan*_*Dan 5 php laravel laravel-5.8

Laravel 5.8应该调度同步、附加和分离事件(https://laravel.com/docs/5.8/releases搜索中间表/数据透视模型事件部分)。

更新:发布此问题后,发行说明已更新(更多信息:https: //github.com/laravel/framework/issues/28050 - https://github.com/laravel/docs/pull/5096)。

我尝试了一下,但以下代码抛出异常:

调用未定义的方法 App\ProjectUser::syncing()

注意:由于 Laravel 5.8 应该调度同步事件,我不想使用外部包。

class User extends Model
{
    public function projects()
    {
        return $this->belongsToMany(\App\Project::class)->using(\App\ProjectUser::class);
    }
}

class Project extends Model
{
    public function users()
    {
        return $this->belongsToMany(\App\User::class)->using(\App\ProjectUser::class);
    }
}

class ProjectUser extends Pivot
{
    public static function boot()
    {
        parent::boot();

        static::syncing(function ($item) {
            dd('syncing event has been fired!');
        });
    }
}

// web.php
$project = \App\Project::first();
$project->users()->sync([1,2]);
Run Code Online (Sandbox Code Playgroud)

我尝试将启动方法从ProjectUser移至User,Project但出现相同的异常。

Dan*_*Dan 5

在 Laravel 5.8上,当您使用 方法sync或将要为所调用的操作触发适当的模型事件(创建、更新、保存......)。请注意,使用, or不会触发任何事件,例如同步、附加或分离。attachdetachsyncattachdetach

更具体地说,为传递给该方法的每个元素触发的事件序列sync是:

  • 保存
  • 创造
  • 已创建
  • 已保存

传递给该方法的每个元素触发的事件序列attach是:

  • 保存
  • 创造
  • 已创建
  • 已保存

传递给该方法的每个元素触发的事件序列detach是:

  • 删除
  • 已删除

因此,如果您想观察同步操作,您实际上必须观察数据透视模型中的保存(或已保存)事件(在本例中ProjectUser):

class ProjectUser extends Pivot
{
    public static function boot()
    {
        parent::boot();

        static::saving(function ($item)  {
            // this will die and dump on the first element passed to ->sync()
            dd($item);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

一个工作示例https://github.com/danielefavi/laravel-issue-example

有关此问题的更多信息https://github.com/laravel/framework/issues/28050

发行说明具有误导性,已更改https://github.com/laravel/docs/pull/5096。