对控制层(control)扩展

2014-09-01 15:13:29
王春生
32881
最后编辑:王春生 于 2014-09-01 16:50:47
简介:对现有模块的control层的扩展有两种,一种是覆盖现有的方法,一种是增加新的方法。下面我们来看下如何进行扩展。

对现有模块的control层的扩展有两种,一种是覆盖现有的方法,一种是增加新的方法。下面我们来看下如何进行扩展。

一、文件命名规则

无论是覆盖现有的方法,还是新增方法,扩展文件都是以方法名为名,保存到ext/control目录下面。文件名都是小写。

比如以user模块为例,我们想重新定义它的注册逻辑,只需要在module/user/ext/control下面创建register.php,然后实现代码即可。

如果我们想为user模块增加一个开放登录功能,比如叫做oauth,只需要在module/user/ext/control下面创建oauth.php,然后实现代码即可。

二、独立扩展代码

在对control层进行扩展的时候,可以完全独立,也可以重用主干代码在control里面定义的方法。下面的例子是完全的独立的。

class user extends control
{
    public function register()
    {
        $this->view->header->title = 'getsid';
        $this->view->sid = session_id();
        $this->view->test = $this->misc->test();
        $this->display();
    }
} 
请大家注意类名的定义:user,从control基类派生而来。这样的定义是完全独立的。

三、继承扩展

上面的例子是独立的扩展,但很多时候还想重用禅道原来的代码,则可以通过继承扩展的方式来实现。
include '../../control.php'; 
class myUser extends user
{
    public function register()
   {
        ....
        $this->process()    // process方法是在../../control.php里面定义
   }
}

首先需要手工包含../../control.php,然后类名定义是 myUser(my + 模块名),从user类派生而来,这样就可以在register方法里面调用../../control.php里面定义的process方法了。

四、限制

由于框架加载机制的限制,control一个方法只能有一个扩展。

评论列表
zt 2020-01-07 10:14:51
在module/user/ext/control下面创建register.php,然后怎么访问register.php中的方法呢?
王春生 2020-01-07 11:10:17
参考我们其他的方法。
tan 2019-12-27 16:25:10
静态方法不能重写吗
tan 2019-12-27 09:42:10
__construct 构造方法貌似不能覆盖。。
代学 2019-05-14 23:16:15
各位开发者们好,禅道新版本(11.4)似乎有个bug,对于control.php里面的方法扩展,若该方法调用了fetch方法,扩展后就会有问题。例如,我在module/project/ext/control/下面新建了一个create.php来扩展原create方法,该方法在传了projectid的情况下应该弹出提示关联需求、设置团队等;但是由于create里面fetch了tips方法,扩展后我发现不会弹出来了,必须要在ext/control/下再新建一个tips.php文件才会弹出来,这个新建的tips.php哪怕是个空文件都行,但就是必须要有。逐行调试了一下发现问题是出在fetch方法的helper::import()方法上面,把这一行注释掉的话,ext/control/下面不创建tips.php也能正常弹出提示框了。不知道这是不是个bug
王春生 2019-05-15 08:18:13
你对control扩展就需要自己实现相应的逻辑。
tony 2019-05-08 08:43:15
扩展项目project控制器,在ext下新增create.php,在create.php中调用fetch('project','tips')方法,其中tips方法在project主干代码中已存在,实际使用报错,can't declare project,提示该类已经被定义,什么原因,如何解决,是不是project被helper::import()了两次
tony 2019-05-07 19:12:04
扩展control,新建一个control文件,然后通过fetch获取父control中方法的内容,会报错,说父control重复定义,不知道有人遇到过没
王春生 2019-05-08 10:13:27
我们新版本的禅道应该是支持的。最近改过。你用的版本估计有些老。
和平哥 2019-05-07 11:46:08
请问一下,我需要单独写一个模块放在my的block下显示,这就需要新增一个printXXXXStatisticBlock方法,为了保证不污染禅道的代码,不能直接写到block/control.php里。经过测试,不能被printStatisticBlock调用,提示Call to undefined method block::printXXXXStatisticBlock。
我的做法是:
在block/ext/control下新建printXXXXStatisticBlock.php,这里用了方法1和方法2的方式,但是都不能被调用,这里应该有什么注意的呢?
王春生 2019-05-07 15:34:26
可以改my下面的视图扩展。在那里面调用。
代学 2019-04-24 10:49:17
请问对control进行继承扩展的时候,类名必须按照my+模块名来命名吗?还有,上面说类名是myUser,但是新版禅道中利用二次开发编辑器生成的类名是myuser,类名有影响吗?
王春生 2019-04-24 17:31:19
类名不区分大小写。自己动手试一下就知道了。
fei 2018-12-14 18:20:46
请问control的ext第三种扩展,目录结构是怎样的
mary 2017-11-10 17:05:33
我想对关闭任务页面里增加关联和检查用例的功能,需要扩展并修改相应的control、model、view三个文件,如果是像这样二次开发了,下次禅道升级里我应该如何合并代码呢 ?
王春生 2017-11-14 14:16:20
按照扩展机制修改。
1/2
发表评论
评论通过审核后显示。