Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MVC。。一个数据库模型是否应该包含所有对象模型的CRUD?活动记录与注册表模式_Php_Codeigniter - Fatal编程技术网

Php MVC。。一个数据库模型是否应该包含所有对象模型的CRUD?活动记录与注册表模式

Php MVC。。一个数据库模型是否应该包含所有对象模型的CRUD?活动记录与注册表模式,php,codeigniter,Php,Codeigniter,我正在用PHP编写一个相当简单的“事实数据库”(使用Codeigniter..但为了学习目的,我试图脱离框架内部),并试图改进我的MVC/OOP实践 以前我会这样做:一个事实模型,一个用户模型,一个源模型。。在每一个模型中,我都会为每个模型放置CRUD逻辑。所以看起来是这样的 $this->fact_model->save($fact); $this->user_model->deactivate($uid); $this->source_model->get

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

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

$this->fact_model->save($fact);
$this->user_model->deactivate($uid);
$this->source_model->get_id($sid);
但在阅读了更多内容后,有一个单独的持久性模型(即“数据库\模型”)似乎是有意义的。但它似乎必须为每种类型的对象包含全范围的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有一个数据库类并使用活动记录,在某种程度上,我只是用其中的一些方法重新创建它。我只是试图理解一些东西,而不依赖于框架内部。有什么评论吗?这仅仅是一个选择的问题吗?

由于你的问题,我试图自己做一些研究,我偶然发现了这篇文章:,它解释了不同数据访问模式之间的差异

我希望我正确地理解了这个问题,但还是这样

我的方法是使用模型分离,不管我通常做的是什么。我会尽量澄清的

假设我的应用程序需要3个独特的功能。对于用户、事实、来源,所有这些模型都可能需要使用一些常见的功能,如保存或加载、更新或删除。与其将公共函数复制到每个模型中,我只需创建一个包含所有公共函数的基类,并让基类扩展CI_模型,然后我将扩展我的公共类的所有新模型文件(用户、事实、源)

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

db\u common\u model公共类(db\u common\u model.php)

用户模型类(db\u common\u model.php)

这种设置模型的方法允许您扩展db_common_模型中的公共功能,这些功能自动可用于所有子类

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


希望这能有所帮助。

CodeIgniter与MVC设计模式甚至OOP范式无关。@tereško请停止在每个询问MVC的CodeIgniter帖子上发布这些错误信息。不管你喜欢与否,MVC确实与CodeIgniter有关@stormdrain即使在您链接到()的论坛中,我们也会看到以下内容:“因此存在一个问题,它不是针对CI的,而是针对任何无状态环境的。”我们可以从MVC中获得一些有用的原则吗?当然可以,但是传统的MVC不可能通过HTTP实现,而且扩展到CodeIgniter中也不可能。@stormdrain既然你很乐意链接到CI曲解和wikipedia文章,那么请友好地阅读它们。我已经指定了4位不同的作者,并建议你仔细阅读wikipedia文章。因为你显然没有任何意图或做任何研究,这一切都是毫无意义的。你知道CodeIgniter和MVC之间有什么联系吗?市场营销。这一可怕的框架被宣传为“mvc框架”,愚蠢的noobs盲目地接受了这一谎言。祝贺你——你就是其中之一。谢谢。这很有帮助。但我想这主要是口味的问题,嗯。但我喜欢你的方法。
  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
    }
  }
  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