Laravel 5.8 同步/附加/分离事件
Laravel 5.8 syncing / attaching / detaching events
Laravel 5.8 应该调度同步、附加和分离事件(https://laravel.com/docs/5.8/releases 搜索 Intermediate Table / 枢轴模型事件 部分)。
更新:发布此问题后已更新发行说明(更多信息: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]);
我试图将引导方法从 ProjectUser
移动到 User
和 Project
但我得到了同样的异常。
在 Laravel 5.8 上,当您使用方法 sync
、attach
或 detach
时,将触发适当的模型事件(创建、更新、保存, ...) 用于调用的操作。请注意,使用 sync
、attach
或 detach
不会触发任何事件,例如 syncing、attaching 或 分离.
更具体地说,为传递给 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);
});
}
}
一个工作示例https://github.com/danielefavi/laravel-issue-example
有关此问题的更多信息https://github.com/laravel/framework/issues/28050
发行说明具有误导性,已更改 https://github.com/laravel/docs/pull/5096。
如果在没有 ID 的情况下调用分离方法(用于分离所有关系),事件不会触发
https://github.com/laravel/framework/pull/27571#issuecomment-493451259
我尝试了很多不同的方法来解决这个需求,但是如果不使用外部包或重写很多方法是不可能的。
我选择chelout/laravel-relationship-events套餐。
它看起来很干净而且不太稳定。并与特征一起使用。
Laravel 5.8 应该调度同步、附加和分离事件(https://laravel.com/docs/5.8/releases 搜索 Intermediate Table / 枢轴模型事件 部分)。
更新:发布此问题后已更新发行说明(更多信息: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]);
我试图将引导方法从 ProjectUser
移动到 User
和 Project
但我得到了同样的异常。
在 Laravel 5.8 上,当您使用方法 sync
、attach
或 detach
时,将触发适当的模型事件(创建、更新、保存, ...) 用于调用的操作。请注意,使用 sync
、attach
或 detach
不会触发任何事件,例如 syncing、attaching 或 分离.
更具体地说,为传递给 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);
});
}
}
一个工作示例https://github.com/danielefavi/laravel-issue-example
有关此问题的更多信息https://github.com/laravel/framework/issues/28050
发行说明具有误导性,已更改 https://github.com/laravel/docs/pull/5096。
如果在没有 ID 的情况下调用分离方法(用于分离所有关系),事件不会触发
https://github.com/laravel/framework/pull/27571#issuecomment-493451259
我尝试了很多不同的方法来解决这个需求,但是如果不使用外部包或重写很多方法是不可能的。
我选择chelout/laravel-relationship-events套餐。
它看起来很干净而且不太稳定。并与特征一起使用。