MVC: вложенные представления и контроллеры (для веб-сайта) - PullRequest
1 голос
/ 17 мая 2010

Я собираюсь сделать сайт PHP, используя шаблон MVC. Я не использую фреймворк, так как сайт довольно прост, и я чувствую, что это даст мне хорошую возможность узнать о паттерне напрямую. У меня есть пара вопросов.

Вопрос 1: Как мне организовать свои взгляды? Я думаю о том, чтобы иметь представление страницы, которое будет иметь верхний и нижний колонтитулы и которое позволит вложенному представлению содержимого находиться между ними.

Вопрос 2. Если у меня есть 5 страниц контента, я должен создать 5 разных представлений, которые можно использовать как контент, вложенный в представление страницы? Или я должен заставить их расширять абстрактное представление с именем AbstractContent?

Вопрос 3: А как насчет контроллеров? Я думаю, что должен быть хотя бы один главный контроллер. Но тогда куда же отправляется запрос? К другому контроллеру? Или я должен просто вызвать просмотр страницы и оставить все как есть? Я думал, что контроллеры должны обрабатывать ввод, возможно модифицировать модель и выбирать представление. Но что, если одно из представлений, вложенных в представление, которое вызывает контроллер, требует дополнительного анализа входных данных?

Вопрос 4. Разрешено ли контроллерам передавать параметры в представление? Или контроллер должен просто изменить модель, которая затем повлияет на вид? Или модель только для доступа к БД и прочим подобным вещам?

Ответы [ 3 ]

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

Вопрос 1:

Это действительно способ сделать это, и я всегда использую его.

Вопрос 2:

Просто сделайте вид максимально простым. Я имею тенденцию создавать только 5 отдельных представлений (простые файлы php).

Вопрос 3:

В обычном шаблоне mvc есть один фронт-контроллер (эта ОС - просто файл начальной загрузки, index.php), который выполняет один контроллер.

В HMVC контроллеры могут отправлять дополнительный запрос другим контроллерам.

Вопрос 4:

Обычный шаблон MVC применяется к обычным приложениям, где представления являются постоянными и могут наблюдать за моделями. С веб-приложениями это невозможно, поскольку при каждом запросе все перезагружается. Поэтому наиболее часто используемый шаблон - позволить контроллеру передавать параметры в представление.

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

1 - это вопрос предпочтений. Простейшим способом было бы иметь отдельный файл верхнего и нижнего колонтитула. Тогда вы можете сделать что-то подобное в вашем контроллере страницы

$title="Page Title";
$var1 = 'var1';
$var2 = 'var2';
$var3 = array("asdf","adsfasdf","234");    

include(HEADER); //$title is in header
include(DIR_VIEWS . 'page.php'); //$var1/2/3 are in page.php
include(FOOTER);

// variable were created before pages were included so they will be set in the templates

Если бы вы пошли по вложенному маршруту, вам пришлось бы начать возиться с str_replace, и он начинает двигаться к движку шаблонов, выходящему за рамки этого ответа.

2 - не нужно делать просмотры объектов. «Представление» может быть просто файлом вашей файловой системы, содержащим HTML для этого представления. Как мой пример выше. Эти страницы также могут содержать основные переменные php to loop / echo.

3 - Вы описываете фронт-контроллер (иногда называемый диспетчером или маршрутизатором). Это действительно путь. Существует несколько способов создания фронт-контроллера.

У вас может быть массив URL, указывающих на контроллеры.

$routes = array (

    '~^/home/$~' => 'home.php',
    '~^/contact/$~' => 'contact.php',
    '~^/blog/.*?$~' => 'blog.php'

);

или вы можете использовать первый «каталог» в URL в качестве имени контроллера и загрузить этот файл из каталога вашего контроллера.

4 - Основная задача контроллера - получить информацию от модели и передать данные в представление.


Отредактировано для комментария

Если вы хотите, чтобы группа представлений имела боковую панель, просто включите это представление в другое представление. Например:

<div id="content">
    <p>lorem ispum stuff</p>
</div>
<?php include(DIR_VIEWS . 'sidebar.php');

Просто убедитесь, что в контроллерах, которые «управляют» страницами с помощью боковых панелей, вы включили некоторый код для функций боковой панели:

if ( $_GET['keywords'] ) {
    $sidebar_search_results = get_search_results($_GET['keywords']);
}
// this code should be in a file that you include

$sidebar_search_results может быть массивом результатов, которые ваш боковой вид анализирует и отображает.

2 голосов
/ 17 мая 2010
  1. Подумайте, как бы вы хотели, чтобы ваши HTTP-ответы выглядели: полные страницы с / без навигации, раздельные страницы для печати, JSON & XML-ответы, индекс / карта сайта. После того, как вы почувствуете, что сайт формируется, добавьте все больше и больше ярлыков для получения вашего ответа с как можно меньшим количеством кода.
  2. Если бы макет страницы был похожим, я бы использовал тот же вид и загружал в него контент из модели (возможно, из базы данных).
  3. Проверьте шаблон Front Controller : вы всегда должны иметь возможность пересекать запрос в одной точке входа. Я бы поставил что-то иерархически перед вашими контроллерами, а затем имел бы один контроллер на «главную страницу» (форум, блог, новости). Этого достаточно для контроля, но вам нужно решить, какие куски достаточно большие / маленькие для вас.
  4. Контроллеры несут ответственность за все, что передается в представления. Контроллеры должны извлекать данные и настройки и что-не из моделей и передавать их в представления.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...