class
EventServiceProvider
extends
ServiceProvider
* The event listener mappings for the application.
*
@var
array
protected
$listen
= [
\App\Events\UserSaving
::
class
=> [
\App\Listeners\UserSaving
::
class
,
}
复制代码
现在,当模型调度事件时,我们已注册的侦听器,就可以在
saving
事件期间被调用。
试用事件处理程序
我们可以使用
tinker
来快速尝试我们的事件监听器:
php artisan tinker
>>> factory(\App\User::class)->create();
=> App\User {
name: "phpcasts",
email: "model_event@phpcasts.org",
updated_at: "2018-05-21 13:57:18",
created_at: "2018-05-21 13:57:18",
id: 2,
}复制代码
如果你已正确注册了事件和侦听者,则应该在
storage/logs/laravel.log
文件中看到该模型的JSON表示形式:
[2018-05-17 13:57:18] local.INFO: {"name":"phpcasts","email":"model_event@phpcasts.org"}复制代码
请注意,此时模型没有
created_at
或
updated_at
属性。 如果你在模型上再次调用
save()
,则日志将具有包含时间戳的新记录,因为
saving
事件会在新创建的记录和现有记录上触发:
>>> $u = factory(\App\User::class)->create();
=> App\User {
name: "phpcasts",
email: "model_event@phpcasts.org",
updated_at: "2018-05-21 13:59:37",
created_at: "2018-05-21 13:59:37",
id: 3,
>>> $u->save();
=> true
一些模型事件允许你阻止继续操作。在我们这个测试的例子中,假设我们不希望在 $user->name
属性中保存包含 admin
、root
等名称的用户的模型,则可以这样做:
* Handle the event.
* @param \App\Events\UserSaving $event
* @return mixed
public function handle(UserSaving $event)
if (in_array($event->user->name, ['admin', 'root'])) {
return false;
}复制代码
在基于
Eloquent Model::save()
的方法中,是否会根据此事件处理程序的结果停止保存的事件检查代码:
public function save(array $options = [])
$query = $this->newQueryWithoutScopes();
if ($this->fireModelEvent('saving') === false) {
return false;
}复制代码
save()
方法对于自定义事件如何进入模型生命周期是个比较好的例子,并且可以被动地执行日志数据或派发作业等任务。
使用观察者
如果你正在监听多个事件,则可能会发现使用观察者类将一个类中的多个事件分组更加的方便。以下是来自
Eloquent事件文档
的一个例子:
namespace
App
\
Observers
;
use
App
\
User
;
class
UserObserver
* Listen to the User created event.
*
@param
\App\User $user
*
@return
void
public
function
created
(
User
$user
)
* Listen to the User deleting event.
*
@param
\App\User $user
*
@return
void
public
function
deleting
(
User
$user
)
}
复制代码
可以在服务提供者
AppServiceProvider
的
boot()
方法中注册观察者 :
* Bootstrap any application services.
*
@return
void
public
function
boot
(
)
User
::
observe
(
UserObserver
::
class
);
}
复制代码
事件/监听者 和 观察者都可以达到监听模型事件的作用,体会两者的使用。
可以阅读
Laravel事件文档
,以更多地了解事件和监听者如何在整个框架中工作。
Eloquent事件文档
是可用事件以及如何使用观察者的很好参考。 最后,我建议通过浏览
Illuminate\Database\Eloquent\Model
类来查找
fireModelEvent()
方法调用的用法,以查看事件如何与模型以及将这些事件组合在一起的
HasEvent
trait。
安装掘金浏览器插件
多内容聚合浏览、多引擎快捷搜索、多工具便捷提效、多模式随心畅享,你想要的,这里都有!
前往安装