框架 代码复用问题

在用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();
}
阅读 4.1k
5 个回答

跟设计模式没关系,跟你的基础有关系,重复代码一定要考虑将代码抽象出来,然后子类集成抽象类,建议你多看看框架源码

举个例子:

abstract class Controller{

    public function add(){
    }
    
    public function update(){
    }
    
    public function delete(){
    }
    
    public function select(){
    
    }
}


class HomeController extends Controller{

    public function getUserInfo(){
        
        $this->select();
    }
    
    
    public function deleteUserInfo(){
        
        $this->delete();
    }
}

class AdminController extends Controller{

    public function getUserInfo(){
        
        $this->select();
    }
    
    
    public function updateUserInfo(){
        
        $this->update();
    }
}

如果粒度更粗,这段代码如果是两个或多个不相干的类需要使用,可以考虑使用php5的新特性Trait,将代码分片抽出来,通过use的方式引入使用,不过你这个需求,只是需要抽象的问题,记得公共的代码,能抽象就抽象出来,Don't Repeat Yourself

面向对象吧,基本的增删改查写个基类,特殊的再继承基类覆写就好了

关键是拿Rbac系统来说:
模型模块有的需要操作中间表
例如,添加角色需要添加role表和 role_auth中间表.每个中间表都不一样.怎么做复用了.
模型也是有部分的业务稍有区别.
怎么处理这种多数业务流程相同,部分不同时的代码复用,用匿名函数?
谁能给个大致框架和思路了?

看了一下代码,其实这已经很简洁了。非要分离的很开的话,试试把 Model 分为 Model 和 service 层?service 处理一些复杂和公用的逻辑,在控制器里调用 service 的方法。但是解耦归解耦,有时候简单的东西搞复杂了就属于过度设计了,任何设计模式都有适用的场合。如果你是 PHP 5.4 以上,也可以试试楼上说的 trait 解耦一些常用代码片段。

推荐问题
宣传栏