PhpTagLib是模仿JSP中的TagLib, 它实现了界面视图跟业务逻辑处理分开, 也就是支持开发MVC结构的系统. PhpTagLib主要是使用一些XML标签去调用系统功能/数据, PhpTagLib是通过编译页面, 生成一个PHP程序, 再运行的, 所以在正常状态(非Debug状态)下运行效率很高. 下面是它的几个主要的有别于一般模板技术的特性:
采用XML标准的语法
组件化
数据流以取(get)方向流动
本文主要将讨论通过PhpTagLib设计出更好的MVC系统的分层结构.
下图是框架中几个主要模块在分层设计中的应用, 通过此图可以看到PhpTagLib是处在表示层中:
在讨论前, 说明一下实际开发中MVC的应用.
MVC: Module-View-Control, 这三部分在实际应用中Module和Control这两个主要是处理数据和业务逻辑的, 有的结构中的解释是Control就是模板引擎或框架控制, 有的是业务处理, 不管哪种, Module和Control就统一称为业务层, View就称为表示层.
我们先看看一般模板技术的MVC结构应用, 一般模板的运行流程是这样的:
1. 运行业务数据处理代码
2. 给模板引擎添加数据, 如assign操作
3. 调用模板
4. 显示
这里业务层和表示层(模板文件)两个的依赖关系是这样的:
如下图:
业务层在运行时给模板引擎模板所需要的数据, 并且要知道要调用哪个模板文件.
表示层(模板文件)需要知道业务层给了哪些数据, 并显示.
也就是这个数据流是推(push), 由业务层推向表示层.
这里如果模板中需要显示什么数据, 就需要修改一下业务层的代码.
当然如果在业务层中把所有的数据都给的话, 那自己考虑一下后果.
而PhpTagLib在开发中MVC的结构应用, PhpTagLib的运行流程是:
1. 运行PhpTagLib页面(表示层)
2. 在页面中调用标签
3. 标签类业务数据
4. 显示
下面是关系图:
这时如果表示层页面中需要显示什么数据, 只要调用相应的标签就可以了, 不用在业务层中指定要显示什么, 而是由表示层自己决定, 主动去调用数据.
所以数据流就是拉(get)的流向.
其实有的模板技术也可以做到由模板页面去主动调用数据, 而不是只依赖业务层给的.
从分层结构来说, 合理的结构应该是上面是表示层, 下面是业务层, 而依赖关系是表示层调用业务层, 业务层并不依赖表示层, 从这里可以看出PhpTagLib能更好的实现这个构架结构.
而实际上, 如上面的分层图中所看到的, 在框架中PhpTagLib主要是关注表示层, 并不是很适合业务逻辑处理, 而业务逻辑处理在框架中建议使用Action模块, Action我将在另一篇文章中讨论.