实现一个简单的Laravel的dd库
前几天写了一个简单的Laravel
的dd库。
为什么自己要写一个这样的库?
Laravel
本身已经实现了自己的输出dd
函数,但是我之所以要写这样一个库,一来是因为Laravel
本身对这个库的封装没办法很好的解剖出来,另一方面,他的实现过于复杂。
安装方式
- composer 安装
composer require nine/dd
- 直接下载
clone 下来即可
使用
- 如我在exapmle.php中所写,我们既可以直接使用:
\dd\Dump::dump('hello,nine');
同时也可以自己封装一个dd
函数:
function dd($value)
{
\dd\Dump::dump($value);
}
dd("hello,nine");
不管是哪种方式,他都会自动的识别我们的类型来予以不同的展示效果。
此外,如果需要自己单独配置样式和新增装饰符号,可以在conf目录下根据所给的注释予以添加。
效果
- string
- array
- function
- object
+
代表public
,-
代表private
,#
代表protected
,属性后面灰色的部分代表默认值。
结构
.
├── Dump.php
├── conf
│ ├── css.php
│ └── decorator.php
├── decorator
│ ├── DecoratorComponent.php
│ ├── Div.php
│ ├── P.php
│ └── Span.php
└── render
├── AbstractDump.php
├── DumpArray.php
├── DumpObject.php
└── DumpString.php
以上是他的主要目录结构。
- 其中
Dump.php
主要是我们用来中转类型的地方,他会根据我们提供数据的不同类型,来解析并用反射类来帮我们实现中转。
conf
层主要是一些配置文件,css.php
是一个样式配置文件,decorator.php
是一个我们需要定制的装饰器,比如=>
符号之类的。 decorator
是装饰器层,DecoratorComonent.php
是一个装饰器基类,他的主要工作是用来初始化我们的样式表,同时提供了一些可以让我们自定义的方法,比如添加span
装饰器,或者给这个装饰器添加一些样式等等。Span.php
等文件主要是我们的具体装饰器,其中主要有两个方法,wrap
方法来完善最终的输出效果,而display
方法则是用来输出。render
是渲染层,这里就像是一个效果加工厂,比如前面提到的decorator
提供了一些添加样式的工具,那么这里就是用来调用这些工具的地方。AbstractRender.php
是一个基类,里面提供了一些初始化我们前面提到的自定义装饰器符号的工具,还有包裹解析我们的数组形成数组的装饰效果(因为像对象还有函数都会用到它),还有像parseParams
会根据我们传入的函数(方法)的参数所形成的反射数组,来进行解析,判断他的默认值等,最终形成一个包裹好的装饰器;display
方法主要就是获取我们的span
之类的装饰器,然后最终调用装饰器的display
方法来予以输出。
而里面的诸如DumpString.php
主要是有提供一个render
方法来给外面的Dump.php
使用,这几个就是会根据具体的类型来进行解析了。
大概思路
我们最终要实现的一个页面效果是像Dom
节点一样,一层一层的包裹着我们最终的元素。所以我能第一时间联系到的就是装饰器
。装饰器去生产各种Dom
节点,为了防止生产对象的滥用,我这里也在AbstractDump.php
文件中加入了单例的判断。当然,里面可能有许多设计的不够合理的地方,还望指正。
个人博客地址:http://www.hellonine.top
。
实现一个简单的Laravel的dd库的更多相关文章
- 【3】创建一个简单的Laravel例子
现在我们来创建一个Laravel的例子来帮助理解 1.首先打开app/Http/routes.php文件,在里边写上一条路由: 2.创建一个控制器,有两种方法 ①在app/Http/Controlle ...
- 实现一个简单的C++协程库
之前看协程相关的东西时,曾一念而过想着怎么自己来实现一个给 C++ 用,但在保存现场恢复现场之类的细节上被自己的想法吓住,也没有深入去研究,后面一丢开就忘了.近来微博上看人在讨论怎么实现一个 user ...
- 一个简单的 JSON 生成/解析库
这是一个单文件的,适用于C语言的, JSON 读写库. 先说明,不想造轮子,代码是从这里拿来的: https://www.codeproject.com/Articles/887604/jWrite- ...
- [development][tcp/ip][ids] 一个简单有参考价值的库 libnids
libhtp 中的例子, 可以通过libnids快速使用. 或者可以快速的写个sniffer. 支持三个功能 ip分片重组, tcp乱序重排, 端口扫描发现. 工程: https://github.c ...
- 用jquery制作一个简单的导航栏
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- C 封装一个简单二叉树基库
引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而 没有遭受到冷 ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
- 一个简单、易用的Python命令行(terminal)进度条库
eprogress 是一个简单.易用的基于Python3的命令行(terminal)进度条库,可以自由选择使用单行显示.多行显示进度条或转圈加载方式,也可以混合使用. 示例 单行进度条 多行进度条 圆 ...
- laravel 实现一个简单的 RESTful API
创建一个 Article 资源 php artisan make:resource Article 你可以在 app/Http/Resources 目录下看到你刚刚生成的 Article 资源 当然我 ...
随机推荐
- phpMyAdmin安装部署
phpMyAdmin 是一个用PHP编写的软件工具,可以通过web方式控制和操作MySQL数据库.通过phpMyAdmin 可以完全对数据库进行操作,例如建立.复制和删除数据等等.如果使用合适的工具, ...
- css简单实现五角星评分、点赞收藏、展示评分(半颗星、1/3颗星)
1.前言 之前做的好几个项目中,都会遇到打分,评分,点赞这样的需求,写了很多次,每次需要再写的时候,就会翻出之前写过的代码,然后copy过来.总觉得这样的话没有进步,没有把知识放进脑袋里,所以,自己花 ...
- 终结 finalize()和垃圾回收(garbage collection)
1.为什么要有finalize()方法? 假定你的对象(并非使用new)获得了一块"特殊"的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以他不知道该如何释放该对象 ...
- ASP.NET Core 源码学习之 Logging[2]:Configure
在上一章中,我们对 ASP.NET Logging 系统做了一个整体的介绍,而在本章中则开始从最基本的配置开始,逐步深入到源码当中去. 默认配置 在 ASP.NET Core 2.0 中,对默认配置做 ...
- Fliptile 翻格子游戏[Usaco2007 Open]
题目描述 Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. ...
- Java中基本数据类型和包装类
参考:深入剖析Java中的装箱和拆箱; Java中基本数据类型和包装类互转中 缓冲机制的使用; java学习笔记:装箱和拆箱,包装器和缓冲池 Java 各 类型数据在内存中分配情况详解 一 java内 ...
- python常用模块(1):collections模块和re模块(正则表达式详解)
从今天开始我们就要开始学习python的模块,今天先介绍两个常用模块collections和re模块.还有非常重要的正则表达式,今天学习的正则表达式需要记忆的东西非常多,希望大家可以认真记忆.按常理来 ...
- angular学习(四)-- Controller
1.4 控制器:Controller ng 中的控制器用来对 scope 进行操作 包括初始化数据和定义事件响应函数等 ng 用来解耦业务逻辑层和视图层的关键 controller 操作 scope, ...
- js版贪吃蛇
之前没有写博客的习惯,这是我的第一个博客,有些的不好的地方,希望大家多多提意见 js版的贪吃蛇相对比较简单,废话不多说直接上代码,有需要注意的地方我会标红,github源码地址https://gith ...
- QTextEdit控件使用
QTextEdit控件使用 QTextEdit *mpContentTextEdit = new QTextEdit(this); //设置占位符文本 mpContentTextEdit->se ...