框架 代码复用问题

manbudezhu 发布于 2017/05/29 20:23
阅读 267
收藏 0

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

在用tp3.3做项目开发时,很多时候增删改查代码基本一致,尤其是控制器部分.但是每个控制器中都相同的代码都需要重复写一遍.
学习过设计模式,这种情况用怎样的模式可以减少代码的重复量.

举个例子,做rbac系统:

这个是我的管理员控制器增删改查的基本代码,除了构造函数创建的模型类不同,基本增删改查结构都差不多,怎么样能减少重复代码了.希望高手能指点一下,谢谢.

protected $_model;
	public function __construct(){
		parent::__construct();
		$this->_model=new MannagerModel();
	}

    /**
     * 管理员添加
     */
    public function addC(){
    	if(IS_POST){
	    	$data=I('post.');
	    	$res=$this->_model->Store($data);
	    	$this->redirectUrl($res,'listC');
	    	}
	    	$this->display();
    }
    /**
     * 管理员列表显示
     * @return [type] [description]
     */
    public function listC(){
    	$data=$this->_model->lists();
    	$this->assign('lists',$data);
    	$this->display();
    }

    /**
     * 管理员删除
     * @return [type] [description]
     */
    public function delC(){
    	$id=intval(I('get.id'));
    	$res=$this->_model->del($id);
    	//跳转判断函数
    	$this->redirectUrl($res);
    }
    /**
     * 管理员更新
     * @return [type] [description]
     */
    public function editC(){
        $id=intval(I('get.id'));
        //where的数组形式
        $where['id']=$id;
        // 显示旧数据
        $old=$this->_model->lists($where);
        $this->assign('old',$old);
        //存储新的数据
        if(IS_POST){
            $data=I('post.');
            $res=$this->_model->edit($id,$data);
            $this->redirectUrl($res,'listC');            
        }

        $this->display();
    }

 

加载中
0
老成有木有

这是一个比较有技术含量的问题了:

1、每个表都有增删改查,其逻辑基本上大致相同,每个表可能有少量个性化的需求。

2、除了后端,你发现前端也一样,增删改查的页面(view)都差不多。

如何将这些相同的特征抽象出来,让代码不重复写,这也是我初学时想到的问题,后来去一家公司上班,发现他们的构架解决了这个问题,每次后台只配置一下,或者写一点点代码,前台基本上可以不写。我就仔细研究他们怎么实现的,经过这几年的积累,写这样的框架自然是小菜一碟了。

1、解决后台的问题,你首先写一个父类,实现增删改查list,add,del,edit四个方法用pretected,重点来了,凡是会变化的地方,都用变量代替,比如$this->redirectUrl($res,'listC'),这个listC应该是变化的吧,下次可能是listA,listB,你就改成$this->redirectUrl($res,$listName),从外面传参数进来,或者最简单写成

$this->redirectUrl($res,$_GET['listName']),好,真正访问的子类可以不写构造函数了,因为子类如果没构造函数,将访问父类的构造函数,然后listA(){parent::list()}或listB(){parent::list($listName)},把变量传进去。当有个性化需求的时候,修改这个函数即可。

2、前台的模板文件其实也可以按此办法,凡是变化的,都用变量,都通过后台传过去,这样就不用复制粘贴很多模板了,但坏处也显而易见,个性化需求太多,需要写很多if。

 

 

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部