Laravel 项目中事件控制的体会--综合应用 trait 多态
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 多态的更多相关文章
- [Laravel-Swagger]如何在 Laravel 项目中使用 Swagger
如何在 Laravel 项目中使用 Swagger http://swagger.io/getting-started/ 安装依赖 swagger-php composer require zirco ...
- 在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)
项目中需要搜索, 所以从零开始学习大家都在用的搜索神器 elasiticsearch. 刚开始 google 的时候, 搜到好多经验贴和视频(中文的, 英文的), 但是由于是第一次接触, 一点概念都没 ...
- Laravel 项目中使用 Bootstrap 框架
Laravel 如何引入 Bootstrap 如官方文档所言,Laravel 并不强制你使用 CSS 框架,但是开箱提供了对 Bootstrap 的支持,在 resources/js/bootstra ...
- laravel项目中手机浏览器在线阅读pdf文件-->PDFJS插件
第一步:下载链接:http://mozilla.github.io/pdf.js/getting_started/#download 第二步:将下载的文件放在项目中. 第三步:在项目中想要预览的地方给 ...
- Laravel 项目中编写第一个 Vue 组件
和 CSS 框架一样,Laravel 不强制你使用什么 JavaScript 客户端框架,但是开箱对 Vue.js 提供了良好的支持,如果你更熟悉 React 的话,也可以将默认的脚手架代码替换成 R ...
- laravel项目中通过nvmw安装node.js和npm 开发环境-- windows版
windows版本安装 此教程执行的时候,网速一定要好.不然可能出现各种错误. 如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ git clone nvmw 直接从 githu ...
- Redis在Laravel项目中的应用实例详解
https://mp.weixin.qq.com/s/axIgNPZLJDh9VFGVk7oYYA 在初步了解Redis在Laravel中的应用 那么我们试想这样的一个应用场景 一个文章或者帖子的浏览 ...
- 在Laravel项目中遇到的一些问题
1. 控制器名字要跟控制器类名保持一致(当保存某个版本的文件时,我通常喜欢复制一份并重命名,这时候重命名的文件的类名并没有改变,着往往回影响结果,却一直找不出错在哪里),在备份的时候应该新建一个文件夹 ...
- 如何在 Laravel 项目中处理 Excel 文件
1.Laravel Excel Laravel Excel 是一款基于PHPExcel开发的Laravel框架专用的Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便.它的Github地址 ...
随机推荐
- 模块和包,logging模块
模块和包,logging日志 1.模块和包 什么是包? 只要文件夹下含有__init__.py文件就是一个包. 假设文件夹下有如下结构 bake ├── test.py ├── __init__.py ...
- urllib基础
import urllib.request # urlretrieve(网址,本地路径) 直接下载网页到本地 urllib.request.urlretrieve("http://www.b ...
- tesseract ocr .Net demo
环境vs 2019 .Net 4.8 新建一个wpf工程,拖放上一个button一个textbox nuget下载tesseract,版本信息如图所示 MainWindow.xaml.cs文件代码如下 ...
- github骚操作
限制搜索 in关键词限制搜索范围 命令 说明 xxx in:name 项目名包含xxx的 xxx in:description 项目描述包含xxx的 xxx in:readme 项目的readme文件 ...
- JSON运用在文件
#include <iostream>#include <fstream>#define JSON_IS_AMALGAMATION#include "json/jso ...
- 基于Windows服务的聊天程序
本文将演示怎么通过C#开发部署一个Windows服务,该服务提供各客户端的信息通讯,适用于局域网.采用TCP协议,单一服务器连接模式为一对多:多台服务器的情况下,当客户端连接数超过预设值时可自动进行负 ...
- JS基础_变量的声明提前、函数的声明提前
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- VUE【二、选项和生命周期】
vue对象,类似于一个viewModel,是处理页面显示的数据模型的对象 其中会有很多选项,以下为较常用的: 选项 1.data-数据 vue实例会代理其data对象里的所有属性 2.methods- ...
- .net 调用 winapi获取窗口句柄和内容
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- SIFT算法相关资料
SIFT算法相关资料 一.SIFT算法的教程.源码及应用软件1.ubc:DAVID LOWE---SIFT算法的创始人,两篇巨经典经典的文章http://www.cs.ubc.ca/~lowe/ 2. ...