DDD / MVC: как избежать попадания в репозиторий из представления? - PullRequest
3 голосов
/ 31 июля 2011

После прочтения нескольких других вопросов похоже, что не рекомендуется, чтобы класс сущностей использовал Репозиторий. Итак, учитывая эти хранилища:

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

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

Я не должен делать это в моем классе:

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

Buts, скажем, у меня есть этот контроллер, который дает список ресторанов для просмотра:

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

Какая «хорошая практика» - получать отзывы о каждом ресторане в сценарии просмотра? Поэтому я не могу сделать это:

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

И я полагаю, что внедрение ReviewRepository в представление - это не то, что мы также можем назвать "наилучшей практикой" ...

Любой комментарий приветствуется!

1 Ответ

3 голосов
/ 31 июля 2011

Если вам нужно иметь отзывы о ресторане, ваш репозиторий должен (возможно, опционально) получить их в ресторане. Они будут храниться в экземпляре класса как набор Обзоров вместе с другими ресторанами другими данными. Это позволит вам создать более эффективный запрос, который за один раз соберет все данные и заполнит требуемые объекты. Шаблон проектирования называется совокупный корень .

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) {
       ...
    }
}
?>
...