【问题标题】:Relations in your model in a MVC application?MVC 应用程序中模型中的关系?
【发布时间】:2009-11-12 18:40:12
【问题描述】:

现在我有一个模型用户,它代表应用程序中的用户。我使用带有 getById($id) 和 getAll() 等方法的 UserRepository。

用户可以发表评论。如果我想显示用户的 5 条或 10 条或 20 条最后的评论,我认为询问用户是最合乎逻辑的。所以我会有一个方法 $user->getLastReviews(5)。

但是实现这一点的最佳方法是什么?给每个用户一个 ReviewRepository 的实例(例如,使用 $reviewRepository->getByUser(User $user) 方法)?还是有更好的方法?

【问题讨论】:

    标签: php domain-driven-design model-view-controller


    【解决方案1】:

    我认为让模型包含并使用其他模型的实例很好,所以你的方式很好,让 User 模型包含 Review 模型的实例,并让该 Review 模型处理获取所述评论的逻辑。

    另外,您可以向 UserRepository 添加一个方法来处理它:

    class UserRepository extends Model{
         $review = new reviewRepository();
         function getReviews($numOfReviews){
             return $this->review->getReviews($user_id);
         }
    

    【讨论】:

      【解决方案2】:

      另一种选择是创建一个存储库方法,您可以在其中传入两个变量。类似于 $reviewRepository->getLastReviewsByUser(5, $user)。

      【讨论】:

      • 这是我到现在为止主要使用的选项 idd。但是我想你在你的控制器中调用这个方法?那么你的领域模型中就没有直接关系,而是间接关系。
      【解决方案3】:

      通常这是ORM 的工作。几乎每个框架都使用一种实现(即 PHP/Symfony 的 Doctrine 或 Java 的 Hibernate),但您自然可以实现自己的 ORM(ORM 通常使用自省来实现)。

      一旦您拥有 ORM 库,您就可以在“设置阶段”定义模型之间的关系(在您的情况下,您将拥有“用户有很多评论”)。然后,您将使用知道如何处理这些方法的 ORM 方法(通常关系是相互的,即“评论属于用户”)。其概念是,此设置阶段将使您免于处理您指出的问题。

      我的建议是使用已经存在的 ORM 实现之一,该实现已经为相关模型的 getter 和 setter 方法提供了便利。在另一种情况下,您必须自己为每个模型编写专门的 getter 和 setter。

      【讨论】:

      • 感谢您的回答。我知道 ORM,但 ORM 也有缺点。如果性能是一个选项,并且您希望使用数据库的全部功能,那么通用 ORM 不是最佳选择。
      • 我认为当您开始编写 getter 方法(即 $user->getLastReviews)时,您已经在编写一个简单的 ORM。一些 ORM 非常轻量级(Kohana 是几个 php 文件),与代码重用和易于维护的优势相比,性能成本可以忽略不计。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 2013-11-20
      • 2017-12-14
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多