什么是事件?如果你在谷歌中搜索这个词,你会得到多个结果。例如,它会被定义为已经发生或被视为发生的一些事;一次事故,尤其是特别重大的。它也可以定义为发生在一段特定时期内特定地点的事。
我喜欢这两个定义,因为它们与我们的内容很符合。事实上,在某种意义上,你可以把这段特定的时期看作模型的生命周期。
你可以创建一个新的实例,更新现有实例,或删除它。你可以做的每个操作都涉及到两个事件。
从基础上来说:我刚刚创建了一条记录,我删除了那条记录,我正在更新那条记录,听起来很自然,对吗?
在当模型的生命周期中,当发生一些事的时候,Eloquent 会触发一些事件:
creating
created
updating
updated
saving
saved
deleting
deleted
restoring
restored
对于每一个操作,都对应两个独立的事件。正如你可能想象的,它们指的是单独的时刻。我们已创建操作作为实例:
你有一个 creating
事件,可以理解为“创建操作即将发生”,而 created
表示“事件已经发生了”。
科学家可能会说:
creating
:是表示 t – 1 时刻created
:是与 t + 1 时刻相关
所以,对于下面三个基本操作,都有两个对应的事件:创建 (create
)、更新 (update
) 和删除 (delete
)。
此外,你还可以看到另外两个操作:保存 (save
) 和恢复 (restore
)。但是,请不要担心,他们并不复杂:
Save:你只需要知道,
save
操作是与create
和update
相关的。我们假设你需要添加一个行为,应用程序是创建一条新的记录还是更新一条已有的记录。难道对相同的事情还要声明两次吗?只需一个普通的save
操作即可。Restroe:当你的某个模型用到了软删除,并执行撤销操作的时候,就会用到
restore
操作。
好吧,我知道你在想什么:这个概念更深一层的含义是什么呢?我们通过实例来解答。
首先我们来看看这个被称为 模型事件(model events) 的技术。它的基本概念非常简单:
在
EventServiceProvider
中你可以添加一个特定的事件监听器,并绑定一个闭包函数在闭包函数中,你不需要接触模型代码就可以添加新的行为
绑定操作必须放在类的
boot()
方法中
这是一个把创建 (created
) 用户事件与闭包函数进行绑定的简单示例。闭包的 $user
参数包含了指定用户的实例:
public function boot(DispatcherContract $events) {
parent::boot($events);
User::created(function($user)
{
// doing something here, after User creation...
});
}
正如你想象的,每一个模型都有这些方法,所以,如果你想为 saved
事件绑定一个操作的话,你必须:
User::saved(function($user) {
// doing something here, after User save operation (both create and update)...
});
另外一个有趣的功能是可以通过预方法停止当前操作。事实上,你可能会用到下面的方法:
creating
updating
saving
restoring
deleting
如果你想退出操作的话,可以返回一个布尔类型的 false
值。
假设用户邮箱以 @deniedprovider.com 结尾的话,我们就退出 create
操作,可以这么做:
User::creating(function($user) {
if(ends_with($user->email, '@deniedprovider.com'))
{
return false;
}
});
很明显,对于 created
, updated
, saved
, restored
, 和 deleted
事件则不能这么做,这些事件已经发生了,不能返回。
转载于:https://blog.51cto.com/caixia/1857977