【问题标题】:PHP MVC - Model needs to access data from another modelPHP MVC - 模型需要从另一个模型访问数据
【发布时间】:2017-05-12 13:26:43
【问题描述】:

我已经构建了一个小型 PHP MVC 框架,只是想阐明将数据从一个模型获取到另一个模型的最佳方法。例如:

我有一个 Users_model,其中包含一个名为 get_users() 的方法。

我还有 Communications_model 需要获取特定或所有用户数据,因此需要从 Users_model 访问 get_users() 方法>.

最好的做法是:

a) 在控制器中实例化 Users_model 并将数据从 get_users() 方法传递到 Communications_model

b) 在 Communications_model 中实例化 Users_model 并从那里运行 get_users() 以便可以直接访问它?

c) 另一种方式?

非常感谢您的帮助。

【问题讨论】:

  • 它基于你的 MVC 结构。是 ORM(像 Laravel)还是像 CI 的结构?
  • 使用 eloquent ORM 将有助于解决这类问题
  • 谢谢。有人能指出一篇关于 ORM 的好文章,它可能会帮助我将它实现到我的框架中吗?

标签: php model-view-controller


【解决方案1】:

这取决于你背后的动机。

  1. 如果你想对结果产生影响,那么使用众所周知的库,如 Doctrine 等应该是你的选择。
  2. 如果您想学习设计模式,那么您应该阅读有关 ActiveRecord 或 DataMapper + Repository 模式的内容。然后实现两者并签出。
  3. 如果你想要你的代码,这种方式——ORM应该代表数据的关系,那么你应该问它更重要的是什么?如果您管理通信(公共汽车,火车),那么可以分配用户并且从通信中获取用户是可以的。如果用户有通信(如汽车),则关系相反。

一切都取决于,你背后的动机是什么。使用像 Doctrine 这样的库,你能帮助你运行你的应用程序吗?如果您想学习设计模式,请查看这两个选项以获得一些经验。

【讨论】:

    【解决方案2】:

    所谓的“用户模型”是repository。你所说的“通信模型”看起来像service

    您的通信服务应该将用户存储库作为依赖项传入构造函数。

    老实说,我认为您的困惑很大一部分是您试图将所有这些东西称为“模型”。这些类属于同一层。您可能会发现 this answer 很有用。

    【讨论】:

      【解决方案3】:

      所有都是可能的方式,但我通常做的是,每当有任何函数我认为会被多个对象多次重用时,我将其声明为static

      这将节省玩对象声明的工作,并且可以通过ClassName::function();轻松访问

      同样,这是一种设计选择,通常对象在控制器中声明并根据需要使用,但只是为了一次又一次地保存对象的声明,我遵循声明函数static的方法。

      【讨论】:

      • 按照设计,您使用静态函数的原因是错误的。如果类是有状态的或无状态的以及其他一些原因,则应通过上下文创建静态或非静态函数。在 99.9% 的情况下,模型类是有状态的,这意味着它应该存在一个实例。
      • 那很好,我的设计意思是基于我的要求和设计。通常实用程序是用抽象类声明的,并且函数保持静态,因为我们确定特定实用程序提供的功能
      【解决方案4】:

      这里的简单原理是使用__construct()(构造函数)从数据库中构建具有相关属性的对象。用户模型将有一个静态函数(因此可通过任何范围访问)来创建实例对象数组,只需将模型数据传递给返回实例的new self()

      这个概念是您最终得到一组 User_Model 实例,每个实例都是从数据库列到属性的构建。剩下的就是创建数据库模型和检索列和数据的函数。

      class Communications_Model {
          private $_all_users;
          public function getUsers() {
              $this->_all_users = Users_Model::loadAllUsers();
          }
      }
      
      class Users_Model {
          private $_example_property;
          public function __construct($user_id) {
              $data = SomeDatabaseModel::getConnection()->loadUserFromDatabase((int)$user_id);
              $this->_example_property = $data['example_column'];
          }
          public static function loadAllUsers() {
              $users = array();
              foreach(SomeDataModel::getConnection()->loadAllUsers() as $data) {
                  $users[] = new self($data['user_id']);
              }
              return $users;
          }
      }
      

      当然,现在,您有一个 $_all_users; 属性,其中包含一个包含数据的实例化用户模型数组。

      【讨论】:

        猜你喜欢
        • 2015-04-12
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 2019-09-07
        • 2012-07-12
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多