前几天写了一个简单的Laraveldd库。

为什么自己要写一个这样的库?

Laravel本身已经实现了自己的输出dd函数,但是我之所以要写这样一个库,一来是因为Laravel本身对这个库的封装没办法很好的解剖出来,另一方面,他的实现过于复杂。

安装方式

  1. composer 安装
composer require nine/dd
  1. 直接下载

    clone 下来即可

使用

  1. 如我在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

以上是他的主要目录结构。

  1. 其中Dump.php主要是我们用来中转类型的地方,他会根据我们提供数据的不同类型,来解析并用反射类来帮我们实现中转。

    conf层主要是一些配置文件,css.php是一个样式配置文件,decorator.php是一个我们需要定制的装饰器,比如=>符号之类的。
  2. decorator是装饰器层,DecoratorComonent.php是一个装饰器基类,他的主要工作是用来初始化我们的样式表,同时提供了一些可以让我们自定义的方法,比如添加span装饰器,或者给这个装饰器添加一些样式等等。Span.php等文件主要是我们的具体装饰器,其中主要有两个方法,wrap方法来完善最终的输出效果,而display方法则是用来输出。
  3. render是渲染层,这里就像是一个效果加工厂,比如前面提到的decorator提供了一些添加样式的工具,那么这里就是用来调用这些工具的地方。AbstractRender.php是一个基类,里面提供了一些初始化我们前面提到的自定义装饰器符号的工具,还有包裹解析我们的数组形成数组的装饰效果(因为像对象还有函数都会用到它),还有像parseParams会根据我们传入的函数(方法)的参数所形成的反射数组,来进行解析,判断他的默认值等,最终形成一个包裹好的装饰器;display方法主要就是获取我们的span之类的装饰器,然后最终调用装饰器的display方法来予以输出。

    而里面的诸如DumpString.php主要是有提供一个render方法来给外面的Dump.php使用,这几个就是会根据具体的类型来进行解析了。

大概思路

我们最终要实现的一个页面效果是像Dom节点一样,一层一层的包裹着我们最终的元素。所以我能第一时间联系到的就是装饰器。装饰器去生产各种Dom节点,为了防止生产对象的滥用,我这里也在AbstractDump.php文件中加入了单例的判断。当然,里面可能有许多设计的不够合理的地方,还望指正。


个人博客地址:http://www.hellonine.top

实现一个简单的Laravel的dd库的更多相关文章

  1. 【3】创建一个简单的Laravel例子

    现在我们来创建一个Laravel的例子来帮助理解 1.首先打开app/Http/routes.php文件,在里边写上一条路由: 2.创建一个控制器,有两种方法 ①在app/Http/Controlle ...

  2. 实现一个简单的C++协程库

    之前看协程相关的东西时,曾一念而过想着怎么自己来实现一个给 C++ 用,但在保存现场恢复现场之类的细节上被自己的想法吓住,也没有深入去研究,后面一丢开就忘了.近来微博上看人在讨论怎么实现一个 user ...

  3. 一个简单的 JSON 生成/解析库

    这是一个单文件的,适用于C语言的, JSON 读写库. 先说明,不想造轮子,代码是从这里拿来的: https://www.codeproject.com/Articles/887604/jWrite- ...

  4. [development][tcp/ip][ids] 一个简单有参考价值的库 libnids

    libhtp 中的例子, 可以通过libnids快速使用. 或者可以快速的写个sniffer. 支持三个功能 ip分片重组, tcp乱序重排, 端口扫描发现. 工程: https://github.c ...

  5. 用jquery制作一个简单的导航栏

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. C 封装一个简单二叉树基库

    引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷 ...

  7. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  8. 一个简单、易用的Python命令行(terminal)进度条库

    eprogress 是一个简单.易用的基于Python3的命令行(terminal)进度条库,可以自由选择使用单行显示.多行显示进度条或转圈加载方式,也可以混合使用. 示例 单行进度条 多行进度条 圆 ...

  9. laravel 实现一个简单的 RESTful API

    创建一个 Article 资源 php artisan make:resource Article 你可以在 app/Http/Resources 目录下看到你刚刚生成的 Article 资源 当然我 ...

随机推荐

  1. Golang使用pprof和qcachegrind进行性能监控

    Golang为我们提供了非常方便的性能测试工具pprof,使用pprof可以非常方便地对Go程序的运行效率进行监测.本文讲述如何使用pprof对Go程序进行性能测试,并使用qcachegrind查看性 ...

  2. Linux 服务器如何配置网站以及绑定域名

    因为域名没有备案,国内地区不能直接域名访问.前段时间在阿里云租购了一台的香港服务器,添加子域名时解析的时发现不能添加直接解析至端口,找了些资料,发现了Nginx绑定域名的方法,在这里做个记录. 1.香 ...

  3. Struts2总结优化登录与转发_02

    优化登录: 使用Struts2中的标签时,会生成大量的tr.td等,决定不使用Struts2中的标签,改用EL表达式,表单有大量数据时,不适合在控制层编写,所以用实体类封装URL中的参数. 控制层代码 ...

  4. pwnable input2 之 write up

    首先看源代码: input2@ubuntu:~$ cat input.c #include <stdio.h> #include <stdlib.h> #include < ...

  5. 表达式求值(二叉树方法/C++语言描述)(五)

    本例中的二叉树图是使用Graphviz绘制的(Graphviz官网),在Ubuntu Linux下可以使用apt-get命令安装它: sudo apt-get install graphviz 表达式 ...

  6. hdu 6093---Rikka with Number(计数)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  7. 关于SQL语句条件值写中文查不到的问题

    在使用jdbc链接MySQL执行SQL语句的时候,sql语句中的where条件,参数值带中文,则查询不到结果,而where条件,参数值都为数字或字母时可以正常查询, 原因是mysql的characte ...

  8. ES6新特性之生成器函数 (generator function): function*

    一.什么是生成器函数(generator function)? 生成器函数是ES6的新特性之一,它是一个在执行时能中途暂时退出,后面重新调用又能重新进入继续执行的一种函数. 并且在函数内定义的变量的所 ...

  9. ExecutorService的submit方法使用

    在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动.调度.管理线程的一大堆API了.在Java5以后,通过Executor来启动线程比用Thread的start()更好.在新特征中 ...

  10. StringBulider简单用法

    StringBuild的是个动态对象,可直接拼加上字符串:而string对象的步骤:先初始化对象并赋值了,而后在拼加字符串时,先要创建需要拼加的字符串,然后再拼加,所以这就是StirngBuild远比 ...