博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel 项目中事件控制的体会--综合应用 trait 多态
阅读量:4685 次
发布时间:2019-06-09

本文共 2235 字,大约阅读时间需要 7 分钟。

1 我们想像有这样的需求

1.1 应用中有两个类。其一是 荣誉(Honour)其一是 档案(Archive)Honour 和 Arhcive 是多态关联。即拥有档案属性的不只荣誉类,还有更多的类去关联,如:新闻、人物等,一个应用类拥有一个档案类。

1.2 为了代码的复用,我们建立一个 Trait, HasArchive 

1.3 功能预期:模型删除时,在 Trait 中,将其所关联的 archive 一并删除。同时,不能影响模型中删除事件的其他逻辑「可能还有权限判断,下级关联删除等相关处理工作」。

2 事件测试

2.1 Traits/HasArchive.php

/**     * The boot method.     */    public static function bootHasArchive()    {        /**         * Handle the "deleting" event.         */        static::deleting(function ($model) {            $class = get_class($model);            info("HasArchive Trait deleting {
$class} {
$model->id}"); if ($archive = $model->archive) { $archive->delete(); } }); static::created(function ($model) { info(__CLASS__ . __METHOD__); }); }

2.2 Honour.php

use HasArchive; protected static function boot()    {        parent::boot();        static::created(function ($honour) {            info(__CLASS__ . __METHOD__);        });    }

2.3 HonourObserver.php

/**     * Handle the honour "created" event.     *     * @param  \App\Honour  $honour     * @return void     */    public function created(Honour $honour)    {        info(__CLASS__ . __METHOD__);    }

2.4 Archive.php

protected static function boot()    {        parent::boot();        static::created(function ($archive) {            info(__CLASS__ . __METHOD__);        });    }

2.5 ArchiveObserver.php

/**     * Handle the archive "created" event.     *     * @param  \App\Archive  $archive     * @return void     */    public function created(Archive $archive)    {        info(__CLASS__. __METHOD__);    }

2.6 在 tinker 中执行测试语句

>>> Honour::create()->archive()->create()

日志输出如下:

[2019-06-06 09:41:17] local.INFO: App\HonourApp\Traits\{closure}

[2019-06-06 09:41:17] local.INFO: App\HonourApp\{closure}
[2019-06-06 09:41:17] local.INFO: App\Observers\HonourObserverApp\Observers\HonourObserver::created
[2019-06-06 09:41:17] local.INFO: App\ArchiveApp\{closure}
[2019-06-06 09:41:17] local.INFO: App\Observers\ArchiveObserverApp\Observers\ArchiveObserver::created

2.7 测试结论

2.7.1 「Trait, Model, Observer」三个地方的事件侦听互不影响

2.7.1 事件执行的顺利: Trait => Model => Observer

转载于:https://www.cnblogs.com/mouseleo/p/10983416.html

你可能感兴趣的文章
SAS学习笔记 - R的数据操作
查看>>
spi master vhd timing
查看>>
MySQL命令行参数
查看>>
2.25-2.26 MapReduce执行流程Shuffle讲解
查看>>
【题解】localmaxima 数论
查看>>
SAP MM 明明已经扩展供应商到采购组织下,采购订单里还是报错?
查看>>
改变Notes ID密码
查看>>
RTOS
查看>>
MongoDB 主从和Replica Set
查看>>
实验报告一
查看>>
vue 用huilder打包APP时,安卓按返回键就退出App改为按两次再退出App
查看>>
vue-学习系列之vue双向绑定原理
查看>>
CSS布局--垂直水平居中
查看>>
MFC中 用Static控件做超链接(可以实现变手形、下划线、字体变色等功能)
查看>>
20144303 《Java程序设计》第五周学习总结
查看>>
多线程(第三天)
查看>>
python 抓取小说网站,制作电子书。
查看>>
restframework视图三部曲
查看>>
失去光标display=none事件的坑
查看>>
Python3.x:函数定义
查看>>