PhpBoot 2.0 文档补充

这玩意也算是有年头了,更新频率并不高,但是对PHP7的支持还是有的,至少我感觉目前用起来还没有出现什么问题。但是文档确实写得很一般,一些地方过于简略,对原理的解释欠缺。当然了,这样看下去肯定会快不少,但是对后期的开发帮助不大,因此我自己大致摸索了一下它的实现,并把需要补充的地方做出说明。

数据库

PhpBoot的数据库组件是对PDO的二次封装,使用了IoC容器。其中实现了QueryBuilder功能,即sql语句拼接;附加了ORM(对象关系映射)功能,可以轻松实现数据的填入和导出。当然了,与Laravel的Eloquent不同,这里不支持ActiveRecord,也就是说每一个实体类必须人工实现。这里我做了一个命令行工具,可以通过读取数据表结构来生成实体类,时机合适的时候我会把它开源出来(因目前项目不方便开源,若能剥离出来我会做一个带各种命令行工具的example)。

config.php 中的数据库配置,对应的是 DB::class 依赖的设置。我们在 config.php 能做的事情,其实远比想象中的多,一会会讲。

使用多个数据库的配置,也是在config.php中,因为官方给出的语句太令人迷惑,因此一开始可能还会很懵圈,其实 \DI\factory 就是在框架内绑定 DB::class 的函数,我们在外面实现了而已,inject 注解和 $app->get() 也是调用了 \DI\get 函数。在这里补充一个知识点,出现\DI\get 这样的函数形式是因为在 php 文件中加了 namespace,即命名空间,因此调用这里面的函数必须带上命名空间。

config.php 配置

在官方文档中,根本就没有它的章节,不过也是,毕竟它基本上就只是拿来配置数据库的。但是,我要补充一下,在 Application::createByDefault 中加载的 config.php ,实际上被载入到了 DI 容器中,也就是说,我们实际上可以在 config.php 配置各种依赖,然后选择在支持依赖注入的地方插入它们。这一点非常的有趣,是普通框架都不会选择的方式。

Hook

这里的 Hook,我基本上可以可以认为是类似中间件的存在,与插件的 Hook 相差甚远(插件的 Hook是可以选择插入到任何一个位置的,这里的 Hook 只能在路由执行前处理。仔细一看,其实就是中间件。

命令行

可能是因为这个功能刚刚推出不久,基本没有打磨的原因,支持得比较随意。而v2.1.1的composer因为某种原因掉了 symfony/console ,所以需要自己装上。本人运行环境是 PHP7.1,所以装了一个 4.4 的组件,发现PhpBoot并没有支持 option (就是带 -- 的参数),所以自己重写了 symfony 的 Command 类的部分方法,封装了一下,手动注册命令。这个倒不难,就是有点麻烦吧。总体而言问题不大,估计作者本人对这个命令行方面没有什么要求,看官方输出都是用的print_r,但是 symfony/console 可是带了 io 组件的,不用就可惜了,还能带颜色哦。关于这一点,我也会在 example 里面进行补充。

缓存

这里值得注意的是,在解析注释以后,会将注解通过 APC 缓存。关于 APC 组件,相信大家已经知道早在 PHP5.3 后就不可用了,取而代之的是 APCu,作者声明 PhpBoot 的 PHP 版本要求是 5.5 及以上,那么就不可能支持 APC(最新可用的版本),而应该是 APCu。目前 PHP 7.x 应该是还在支持,看最后的更新日期是 2019-10-28,也没有说已经被废弃,所以暂时还是可用的。但是,本人觉得这样的扩展现在已经没有太大优势,毕竟现在 PHP 7 的性能已经不像以前那么差了,APCu 的加速作用不大。

不过,业务逻辑上的缓存倒是可以给我们随便配置,毕竟写业务逻辑的人是我们啊(笑)。

更新:要注意一点,如果没有在 config.php 中配置,Application 会识别是否支持 APC(u),然后决定使用 APC(u) 或者文件缓存。但是缓存目录 sys_get_temp_dir() 在Windows下有可能指向 C:\Windows,这就很骚了,它还能正常写入,搞得我手动去 Windows 目录下手动删缓存,最后我还是在 config.php 中配置了文件缓存并指定路径。这一点是很迷的,估计是 php.ini 里没设定好,所以不要过度依赖 PHP 给的系统目录。

 

其他的目前还没有什么值得补充,就是这几点在初入门的时候会有些迷糊,也算是我的一种吐槽吧。PhpBoot整体的设计还是挺简洁的,也比较接近现代化的设计,用上去没有什么不舒服的地方。如果作者有心继续优化,我也会相应地做一些共享;否则我只会另起炉灶,与他背道而驰。

发表评论