gpt4 book ai didi

model-view-controller - DDD/MVC : how to avoid hitting the Repository from the View?

转载 作者:行者123 更新时间:2023-12-03 01:16:05 25 4
gpt4 key购买 nike

在阅读了其他几个问题后,看起来不建议让实体类使用存储库。因此给定这些存储库:

class RestaurantRepository {
public function findAll() { ... }
}

class ReviewRepository {
public function findByRestaurant(Restaurant $restaurant) { ... }
}

我不应该在类里面这样做:

class Restaurant {
public function getReviews() {
// ...
return $restaurantRepository->findByRestaurant($this);
}
}

但是假设我有这个 Controller ,它向 View 提供餐厅列表:

class IndexController {
public function indexAction() {
$restaurants = $restaurantRepository->findAll();
$this->view->restaurants = $restaurants;
}
}

在 View 脚本中获取每家餐厅的评论的“良好做法”是什么?因此我不能这样做:

foreach ($this->restaurants as $restaurant) {
$reviews = $restaurant->getReviews();
}

而且我想在 View 中注入(inject) ReviewRepository 也不是我们所说的“最佳实践”......

欢迎任何评论!

最佳答案

如果您需要餐厅的评论,您的餐厅存储库应该(也许,可选)从餐厅检索这些评论。这些将作为评论集合以及每个餐厅的其他数据存储在类实例中。这将允许您构建一个更有效的查询,一次性获取所有数据并填充所需的对象。设计模式称为aggregate root .

class RestaurantRepository {
public function findAll($withReviews = 0) { ... }
}

class IndexController {
public function indexAction() {
$restaurants = $restaurantRepository->findAll(1);
$this->view->restaurants = $restaurants;
}
}

<?php
foreach ($this->restaurants as $restaurant) {
foreach ($restaurant->reviews as $review) {
...
}
}
?>

关于model-view-controller - DDD/MVC : how to avoid hitting the Repository from the View?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6889420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com