当使用模型操作的时候会触发一些事件,我们可以根据不同的事件进行数据的处理。比如想要实时更新数据到 ElasticSearch 可以监听 swoft.model.saved 事件进行添加,监听 swoft.model.updated 更新,又或者要实时更新缓存,也可以使用这个办法。
公共的事件名列表, 可以在Swoft\Db\DbEvent 类中参看所有事件如果是正在进行时(ing) 在监听事件中是调用了 $event->stopPropagation(true); 后续操作会终止直接返回结果. 对过去式停止无效
创建模型事件监听器
创建模型使劲监听器跟创建其他事件监听器一样,都是放在 app/Listener 目录,也是实现 EventHandlerInterface 接口。
单模型单动作监听
namespace App\Listener;
use App\Model\Entity\User;
use Swoft\Event\Annotation\Mapping\Listener;
use Swoft\Event\EventHandlerInterface;
use Swoft\Event\EventInterface;
/**
* Class UserSavingListener
*
* @since 2.0
*
* @Listener("swoft.model.user.saving")
*/
class UserSavingListener implements EventHandlerInterface
{
/**
* @param EventInterface $event
*/
public function handle(EventInterface $event): void
{
/* @var User $user */
$user = $event->getTarget();
if ($user->getAge() > 100) {
// stopping saving
$event->stopPropagation(true);
$user->setAdd(100);
}
}
}
$event->getTarget()我们在学习事件的时候有学过这个,就是发送事件的时候传递的第二个参数
多模型单动作监听
namespace App\Listener;
use App\Model\Entity\User;
use Swoft\Db\DbEvent;
use Swoft\Db\Eloquent\Model;
use Swoft\Event\Annotation\Mapping\Listener;
use Swoft\Event\EventHandlerInterface;
use Swoft\Event\EventInterface;
/**
* Class RanListener
*
* @since 2.0
*
* @Listener(DbEvent::MODEL_SAVED)
*/
class ModelSavedListener implements EventHandlerInterface
{
/**
* @param EventInterface $event
*/
public function handle(EventInterface $event): void
{
/* @var Model $modelStatic */
$modelStatic = $event->getTarget();
if ($modelStatic instanceof User) {
// to do something....
}
// ....
}
}
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要PHP进阶架构师>>>视频、面试文档免费获取shimo.im
或 者关注咱们下面的知乎专栏PHP架构师圈子zhuanlan.zhihu.com