MVC .一个database_model是否应该包含所有object_models的 CRUD?活动记录与注册表模式


MVC .. should one database_model contain CRUD for all object_models? Active record vs. registry pattern

我正在用PHP编写一个相当简单的"事实数据库"(使用Codeigniter..但我试图摆脱框架内部以用于学习目的),并试图改进我的MVC/OOP实践。

以前我会这样做:一个事实模型,一个用户模型,一个源模型......在每个模型中,我会为每个模型放置CRUD逻辑。 所以它看起来像这样..

$this->fact_model->save($fact);
$this->user_model->deactivate($uid);
$this->source_model->get_id($sid);

但是在阅读了更多之后,拥有一个单独的持久性模型(即"database_model")似乎是有意义的。 但是,似乎它必须为每种类型的对象包含全范围的CRUD,这对我来说似乎是浪费。 我想我正在寻找如何去这个...

$this->db_m->save(Fact $fact);
$this->db_m->update(User $user);
// .. etc .. but also ..
$this->db_m->get_user_id($uid);
// .. and ..
$htis->db_m->get_all_facts();

这是朝着正确的方向前进吗? 我是否最终只是在数据库模型中测试类型并在需要时切换? 还是要为每种类型的对象扩展数据库模型?

$this->fact_db_m->save(Fact $fact);
$this->fact_db_m->get_all();
$this->source_db_m->get_id($sid);

或者类似的东西,我想这是最接近CIs AR实现的。

$this->db_m->save('facts', Fact $fact);
$this->db_m->get('user', array('id'=>$uid));

我想这是"活动记录与存储库"的情况。 我知道存储库更容易测试,并且 CRUD 逻辑与对象数据是分开的,这种分离对我来说很有意义。 但是..这意味着您必须为每个实体编写单独的存储库模型。 这是对的吗?

顺便说一句 - 我知道 Codeigniter 有一个数据库类并使用活动记录,在某种程度上,我只是用其中一些方法重新创建它。 我只是试图在不依赖框架内部的情况下理解事物。 有什么意见吗? 这只是一个选择问题吗?

尝试自己做一些研究,多亏了你的问题,我遇到了这篇文章:http://msdn.microsoft.com/en-us/magazine/dd569757.aspx,它解释了不同数据访问模式之间的差异。

我希望

我正确理解了这个问题,但在这里。

我的方法是使用模型的分离,但是我通常做的一个扭曲。 我会尽量说清楚。

假设我的应用程序将需要 3 个独特的功能。一个用于用户,事实,来源,所有这些模型可能需要使用一些常见的函数,如SAVE 或LOAD,或UPDATE或DELETE。我不会将公共函数复制到每个模型中,而是简单地创建一个包含所有公共函数的基类,让基类扩展CI_Model,然后我所有的新模型文件(用户,事实,来源)我将扩展我的公共类。

为了更好地说明这一点,我将抛出一些基本代码

db_common_model 通用类 (db_common_model.php)

  class db_common_model extends CI_Model
  {
    public function __construct()
    {
      parent::__construct();
    }
    /**
    * All Common Functions Here */    
    public function save()
    {
      // Do stuff
    }    
    public function update()
    {
      // Do stuff 
    }    
    public function etc()
    {
      // Do stuff
    }
  }

users_model类 (db_common_model.php)

  class users_model extends db_common_model
  {
    public function __construct()
    {
      parent::__construct();
    }
    /**
    * user specific functions */    
    public function get_one()
    {
      // Do stuff
    }    
    public function get_all()
    {
      // Do stuff 
    }    
    public function get_latest()
    {
      // Do stuff
    }    
    public function etc()
    {
      // Do stuff
    }
  }
  /**
  * When using it in CI Controller
  */
  $this->user_model->get_one(); // loads user specific function
  $this->user_model->save(); // Calls all inherited methods from parent db_common_model
  // Etc

这种设置模型的方式允许您扩展db_common_model中的通用功能,这些功能自动可供所有子类使用。

这允许干净的组织,并允许您不必在每个模型中重新发明您的通用功能。

希望这有帮助。