我在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);
或类似的东西,我猜这是最接近CI的AR实施。
$this->db_m->save('facts', Fact $fact);
$this->db_m->get('user', array('id'=>$uid));
我想这是“活动记录与存储库”的情况。我知道存储库更容易测试,并且CRUD逻辑与对象数据是分开的,并且这种分离对我来说是有意义的。但仍然......这意味着你必须为每个实体编写一个单独的存储库模型。这是对的吗?
顺便说一句 - 我知道Codeigniter有一个数据库类并使用活动记录,在某种程度上我只是用这些方法重新创建它。我只是试图在不依赖框架内部的情况下理解事物。任何意见?这只是一个选择问题吗?
答案 0 :(得分:1)
尝试自己做一些研究,多亏了你的问题,我发现了这篇文章:http://msdn.microsoft.com/en-us/magazine/dd569757.aspx,它解释了不同数据访问模式之间的差异。
答案 1 :(得分:1)
我希望我能正确理解这个问题,但是这里有。
我的方法是使用模型的分离,但我通常会做一个扭曲。我会尽力说清楚。
让我们说我的应用程序将需要3个独特的功能。一个用户,事实,来源,所有这些模型可能需要使用一些常见的功能,如SAVE或LOAD,或UPDATE或DELETE。不是将公共函数复制到每个模型中,我只是创建一个包含所有常用函数的基类,并且基类扩展CI_Model,然后我将扩展我的所有新模型文件(用户,事实,源)我的普通班。
为了更好地说明这一点,我将抛出一些基本代码
db_common_model Common Class(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中的所有子类自动可用的常用功能。
这样可以实现干净的组织,并且您无需在每个模型中重新创建常用功能。
希望这有帮助。