1

这个问题非常具体且冗长,涉及扩展 CodeIgniter 的模型。这并不重要(我的应用程序目前工作)但我问这个是因为我想知道是否有一种“干净”的方式来做到这一点。

我最近写了一篇关于我用来使 CRUD 方法对我的模型通用的技巧的博客文章。因为我只在涉及模型时使用“数据库”库,所以我扩展了核心模型 (MY_Model) 以简单地从其构造函数加载数据库,而不是自动加载它。自动加载它并不是什么大问题,但重点是(这对接下来的内容很重要);我以后可能想用这个构造函数来执行其他的事情,所以需要有一个构造函数。

当我考虑使 CRUD 方法通用时,我考虑再次使用 MY_Model,并且能够成功定义“create”、“update”、“delete”和“load_from_id”方法。但是,这些方法隐含地依赖于一个接口,或者需要在任何模型中定义的一组方法(除了静态/常量参数覆盖之外,例如一些验证,或者要在删除时调用的函数以级联特定结果在数据库中)。两种解决方案;使用 PHP接口或使 MY_Model抽象并声明抽象方法。

解决方案2无法实现,因为我需要在MY_Model中有一个有效的构造函数,而且无论如何,我需要能够调用CI_Model的构造函数(即使到目前为止没有任何东西,我也不能假设永远不会) . 在这种情况下,继承堆栈将是 (concrete [ CI_Model], abstract [ MY_Model],concrete [ ]),从我的具体模型Any_model调用时我需要“跳过一代” 。parent::__construct();另外我不知道 CI 是否支持抽象核心类扩展。

对于解决方案1,我也不确定它是否可以实现。假设我定义了一个具体的类MY_Model和一个接口CrudModelInterface。我把所有的属性都放进去MY_Model(它们不能在界面中),但是我的 CRUD 方法需要使用它们,所以CrudModelInterface必须扩展MY_Model对吗?这就是我变得模糊的地方......

如果你明白我想做什么,你能告诉我我的设计,你会怎么做,等等。任何建设性的。目前,我根本没有强加约束来定义那些“接口方法”,但我在每个模型中都这样做,所以它有效。它只是不是很干净。

4

1 回答 1

1

推荐的选项是使用Supercharged DataMapper ORM for CodeIgniter或其他 ORM 库,而不是编写自己的东西。

但是在回答您的直接问题时,我认为您并不真的需要接口或抽象函数。这是 MY_Model 和另一个具体模型的快速示例

class MY_Model extends CI_Model {

   public $_table;

   public function find_all() {
        return $this->db->from($this->_table)->get()->result_object();
   }

   public function find_by_id($id, $id_field_name = 'id') {
        $this->db->where("$this->_table.$id_field_name", $id);
        $result = $this->find_all();
        return count($result) == 1 ? $result[0] : null;
   }

   public function insert($data) {
        $this->db->insert($this->_table, (array) $data);
        $id = $this->db->insert_id();
        return $id;
   }

   public function update($id, $data) {
        if ($id != null) {  // update existing record
            $updated = $this->db->update($this->_table, $data, "id = $id");
            return $updated;
        } else {            // add a new record
            $inserted = $this->insert($data);
            return $inserted;
        }
   }

   public function delete($id) {
        $deleted = $this->db->delete($this->_table, array('id' => $id), 1);
        return $deleted;
   }

    .........

}

现在,为了从 MY_Model 的功能中获益,您所要做的就是定义您的模型并使用表名设置 $_table 变量。

class Users_Model extends MY_Model {

    public $_table = 'users';

}

显然,您可以在 MY_Model 中添加很多其他方法来进一步扩展它。这种方法来自Bonfire,它是一个构建在 CodeIgniter 之上的 HMVC。查看他们的 MY_Model 实现

于 2013-06-28T20:26:31.573 回答