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

Laravel 项目中事件控制的体会--综合应用 trait 多态的更多相关文章

  1. [Laravel-Swagger]如何在 Laravel 项目中使用 Swagger

    如何在 Laravel 项目中使用 Swagger http://swagger.io/getting-started/ 安装依赖 swagger-php composer require zirco ...

  2. 在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)

    项目中需要搜索, 所以从零开始学习大家都在用的搜索神器 elasiticsearch. 刚开始 google 的时候, 搜到好多经验贴和视频(中文的, 英文的), 但是由于是第一次接触, 一点概念都没 ...

  3. Laravel 项目中使用 Bootstrap 框架

    Laravel 如何引入 Bootstrap 如官方文档所言,Laravel 并不强制你使用 CSS 框架,但是开箱提供了对 Bootstrap 的支持,在 resources/js/bootstra ...

  4. laravel项目中手机浏览器在线阅读pdf文件-->PDFJS插件

    第一步:下载链接:http://mozilla.github.io/pdf.js/getting_started/#download 第二步:将下载的文件放在项目中. 第三步:在项目中想要预览的地方给 ...

  5. Laravel 项目中编写第一个 Vue 组件

    和 CSS 框架一样,Laravel 不强制你使用什么 JavaScript 客户端框架,但是开箱对 Vue.js 提供了良好的支持,如果你更熟悉 React 的话,也可以将默认的脚手架代码替换成 R ...

  6. laravel项目中通过nvmw安装node.js和npm 开发环境-- windows版

    windows版本安装 此教程执行的时候,网速一定要好.不然可能出现各种错误. 如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ git clone nvmw  直接从 githu ...

  7. Redis在Laravel项目中的应用实例详解

    https://mp.weixin.qq.com/s/axIgNPZLJDh9VFGVk7oYYA 在初步了解Redis在Laravel中的应用 那么我们试想这样的一个应用场景 一个文章或者帖子的浏览 ...

  8. 在Laravel项目中遇到的一些问题

    1. 控制器名字要跟控制器类名保持一致(当保存某个版本的文件时,我通常喜欢复制一份并重命名,这时候重命名的文件的类名并没有改变,着往往回影响结果,却一直找不出错在哪里),在备份的时候应该新建一个文件夹 ...

  9. 如何在 Laravel 项目中处理 Excel 文件

    1.Laravel Excel Laravel Excel 是一款基于PHPExcel开发的Laravel框架专用的Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便.它的Github地址 ...

随机推荐

  1. linux命令(ubuntu18)记录...

    1.解压.zip文件unzip unzip studentCRUD-master.zip              2.读写权限chmod指令 r表是读 (Read) .w表示写 (Write) .x ...

  2. linux fork进程请谨慎多个进程/线程共享一个 socket连接,会出现多个进程响应串联的情况。

    昨天组内同学在使用php父子进程模式的时候遇到了一个比较诡异的问题 简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复 ...

  3. Java 同一个类的不同实例对象竟然可以相互访问各自的private成员

    如题,在看String源码的某个函数时,发现了这个操作是被允许的,而且可以直接改变private字段(不是final按理是可以改变),这与之前的理解有点相背. 接下来试图整理下Google来的结论: ...

  4. request.getScheme() 使用方法(转)

    今天在看代码时,发现程序使用了 request.getScheme() .不明白是什么意思,查了一下.结果整理如下: 1.request.getScheme() 返回当前链接使用的协议:一般应用返回h ...

  5. mysql5.7 密码字段名更改

    由password更改为authentication_string update user set authentication_string=password("123456") ...

  6. ffmpeg源码分析之媒体打开过程

    int avformat_open_input(AVFormatContext **ps,           const char *filename,           AVInputForma ...

  7. netty 自定义协议

    netty 自定义协议 netty 是什么呢? 相信很多人都被人问过这个问题.如果快速准确的回复这个问题呢?网络编程框架,netty可以让你快速和简单的开发出一个高性能的网络应用.netty是一个网络 ...

  8. vue-Elementui引入

    安装命令 npm install --save element-ui 可以直接复制官网的引用,复制到main.js里面:就可以忽略下面所有步骤 import Vue from 'vue'; impor ...

  9. Python诞生以来意义菜谱

    自Python诞生以来,它被誉为最简单的编程语言.进入人工智能时代后,它逐渐成为编程领域的主导语言. Python是一种快速.强大.高效和灵活的编程语言家常菜做法大全.学习后,无论您是想进入数据分析菜 ...

  10. LED点阵显示

    /*********************************************************** 8*8LED点阵---显示数字实验 实现现象:下载程序后点阵上显示数字0 注意 ...