- 1 认识 zentaoPHP 框架
- 2 入口文件
- 3 配置管理
- 4 模块管理
- 4.1 控制器(control)
- 4.2 业务逻辑(model)
- 4.2.1 定义 model
- 4.2.2 跨模块调用
- 4.2.3 获取模块名
- 4.2.4 删除记录
- 4.2.5 数据处理对象 dao
- 4.3 模版视图(view)
- 4.4 从 hello world 开始
- 4.5 模块的配置
- 4.6 模块的语言
- 4.7 模块的 CSS 和 JS 管理
- 5 类库
- 6 扩展机制
- 6.1 扩展机制简介
- 6.2 新增独立模块
- 6.3 对控制层(control)扩展
- 6.4 对模型层(model)扩展
- 6.5 对视图层(view)扩展
- 6.6 对样式表和js进行扩展
- 6.7 对语言配置进行扩展
对模型层(model)扩展
- 2021-09-27 11:02:36
- admin
- 1899
- 最后编辑:admin 于 2021-09-28 18:27:09
model为模型方法,主要用来处理各种数据的查询、更新。model的扩展分为两种方式,一种是直接新增或者覆盖方法,另一种则是完全定义一个新的类,下面分别来讲述下各自实现的机制。
一、直接新增或者覆盖方法
不管是新增方法还是覆盖现有的方法,都是在模块的 ext/model/ 目录下面建立相应的以方法名为名的文件。比如,我们打算对 misc 的 model 新增一个方法,叫做 foo,那么只需要在 misc/ext/model/ 下面建立 foo.php,代码如下:
public function foo() { return 'foo'; }
需要说明的是这里面的定义不包含类的声明,就只是一个方法的声明。zentaoPHP 框架在执行的时候,会自动将扩展目录下面的 foo.php 里面的代码,替换 misc/model.php 中的 foo 方法的代码。如果是新增的方法,则会追加到misc/model.php 的代码中,最终生成一个合并之后的 model 类文件。
二、通过类的方式来扩展(推荐)
对于 model 的扩展,可以将所有的扩展放在一个类里面,然后通过框架的 loadExtension() 方法来加载。这种主要是为了解决加密文件冲突的问题。zentaoPHP 框架在处理 model 的扩展时,会把相应的代码进行合并,但这时候问题就来了。如果对第一种方法的扩展,也就是exe/model/abc.php进行加密,就会和其他的开源的 model 扩展冲突。如果不加密,无法保护作者的代码。为了解决这个问题,zentaoPHP 框架实现了另一种扩展方法,下面我们来了解下:
将主要的扩展逻辑存放到 ext/model/class/插件名.class.php中。
然后在 ext/model/插件名.php 的扩展里面使用 $this->loadExtension() 来调用相应的方法。
ext/model/class/*.class.php 代码可以加密。而 ext/model/*.php 可以不用加密。
因为框架对 model 的扩展是采取合并文件的方式,ext/model/*.php 文件不能加密。
2.1 在 ext/model/class/ 下面创建一个类,文件名的规则是:插件名.class.php。
文件名须用小写,例如你的插件名为 zentaoBox ,则文件名应为 zentaobox.class.php。
比如禅道的甘特图插件,定义为project/ext/model/class/gantt.class.php,里面定义各种代码。
类名规则是{插件名}{模块名},模块名首字母大写,如 ganttProject。
class ganttProject extends projectModel { public function createRelationOfTasks($projectID) { } }
注意:这个地方类是继承自projectModel,这样还可以重用原来的代码。
2.2 在 ext/model/ 创建调用的程序。比如叫做 project/ext/model/gantt.php
public function createRelationOfTasks($projectID) { $this->loadExtension('gantt')->createRelationOfTasks($projectID); }
通过 loadExtension() 方法来调用2.1里面调用的 gantt.class.php 里面的方法。
这样禅道框架只需要对所有的class扩展进行加密就可以了,就可以解决加密文件冲突的问题了。
注意:
对公共模块(common)的业务逻辑model进行扩展时,扩展类名为 extCommonModel。