Обработка фрагментов и представлений в MVC - PullRequest
4 голосов
/ 19 мая 2010

если у меня есть страница на моем сайте, где я должен показать 4 или 5 фрагментов (новостных лент, каналов событий и т. Д.), Связанных с разными данными (в разных моделях и таблицах БД), то какой разумный способ справиться с генерацией фрагмента контента и макета? я мог бы использовать один контроллер сниппета, который содержит статические функции, каждая из которых возвращает представление, заполненное соответствующими данными. Но каждая функция в этом контроллере сниппета будет взаимодействовать с различными данными / моделями, поэтому я не уверен, насколько это ООП. Или я мог бы просто добавить статическую функцию для каждого из контроллеров, которые имеют дело с каждым связанным набором данных - например, в News_Controller, а также функции для отображения всех новостных элементов, отдельных новостных элементов и т. Д. Я мог бы добавить статическую функцию генерировать ленту новостей, просто возвращая нужное мне представление Я думаю, что этот подход может сработать, так как я не хочу создавать экземпляр объекта для этих простых фрагментов, поэтому наличие статических функций в соответствующих контроллерах имеет смысл. Здесь немного потока сознания, но я что-то понимаю ?!

Ответы [ 3 ]

2 голосов
/ 19 мая 2010

Многие фреймворки имеют некоторое понятие «частичные», которые обычно используются для такого рода вещей.

Поскольку эти частичные данные, как правило, доступны только для чтения и часто отображаются на каждой странице (или некотором четко определенном наборе страниц), вы можете подходить к ним, не думая с точки зрения контроллеров, как на странице.

Другими словами - помните, что это нормально, если ваш код вида / макета общается напрямую с вашими моделями, если он только опрашивает их.

Я все время так делаю:

layout.php:

<div id="newsWidget">
<?PHP $news = Model_News::latest(); ?>
<?PHP foreach($news as $newsitem): ?>
<!-- output some news headlines -->
<?PHP endforeach; ?>
</div>

Model_News :: latest () может реализовывать некоторое кэширование и т. Д., Так как это код макета, и я, вероятно, не хочу нажимать на БД при каждом запросе.

Контроллер-наворот не нужен!

1 голос
/ 19 мая 2010

Возможно, вы захотите взглянуть на Hierarchical Model-View-Controller (HMVC). Это особенно подходит для создания страниц с фрагментами. Я верю, что Кохана это реализует.

По сути, у вас есть несколько триад Model-View-Controller, каждая из которых отвечает за каждый фрагмент. Таким образом, у вас может быть контроллер для доступа к базе данных новостей и загрузки различных небольших представлений для различных типов отображения новостей.

0 голосов
/ 19 мая 2010

Вы можете спроектировать свой шаблон MVC, чтобы обеспечить механизм, позволяющий возвращать данные, которые были заданы, в виде массива. Например, обычно веб-запрос к /news/feed/ приводит к тому, что соответствующие данные устанавливаются и впоследствии передаются в представление. В дополнение к веб-запросам система также должна позволять контроллеру делать такой запрос, т. Е. $vars = $this->call('/news/feed/'); Система будет распознавать внутренний запрос и возвращать установленные переменные, а не вызывать представление.

Это позволяет сохранить целостность ваших контроллеров и моделей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...