В течение последних нескольких недель я изучал шаблон проектирования MVC для веб-приложений, использующих PHP. В целом я понимаю, как работает этот шаблон и почему он является очень хорошим способом реализации любого вида веб-приложений, от маленьких до больших.
Насколько я понимаю, у нас есть 3 различных слоя, которые общаются друг с другом через контроллер, например:
Пользовательский ввод ---> Вид ---> Контроллер ---> Модель
Выход сайта <--- Вид <--- Контроллер <--- Модель </p>
С моим запланированным внедрением я надеюсь иметь модель для каждой таблицы в моей базе данных, и каждая модель будет иметь все функции / логику, необходимые для управления этой таблицей. В свою очередь каждая из этих моделей будет иметь связанный вид. Модель и представление, конечно, будут иметь контроллер, который позволяет их использовать.
Теперь это легко осознать, поскольку каждое логическое действие, требующее базы данных, покрыто. Однако, что происходит, когда конкретное действие требует использования более одной таблицы / модели?
Административной стороне приложения вряд ли понадобится более одной модели за один раз для обслуживания базы данных. Внешний интерфейс или пользовательская часть приложения - это другое дело! Скажем, у меня есть веб-страница, на которой показан список статей для определенного раздела, список зарегистрированных в настоящее время пользователей и - заимствование примера из SO - статистика сайта, такая как облако тегов.
Эта страница потребует как минимум 3 модели в моем запланированном дизайне - статья, пользователи и теги.
Очевидно, что мои единственные контролеры не собираются сокращать это. Так что мне делать?
Создать новые монолитные контроллеры для моих веб-страниц?
- позвольте мне получить желаемый результат
- потребует много повторяющихся кодов
- очень сложно поддерживать, если требуются изменения
Создание «супер» контроллера, который манипулирует меньшими конкретными контроллерами
- позволяет мне получить желаемый результат
- будет модульным, поэтому изменения в одном скрипте не должны влиять на другие
- минимальное дублирование кода
Создать [вставить блестящее решение здесь]
В настоящее время я ошибаюсь в Варианте 2. Просто потому, что теоретически он должен сократить кодирование, поскольку все необходимое поведение будет присутствовать в меньших контроллерах - и все будет легко поддерживать.
Возможно, это могло бы выглядеть так:
articlecontroller.php
<?php
//Article Controller Script
if($_GET['article'] = 'foo')
{
//magic necessary for displaying article "foo".
}
?>
usercontroller.php
<?php
//User Controller Script
if($_GET['user'] = 'display')
{
//magic necessary for displaying users
}
?>
supercontroller.php
<?php
//"Super" Controller
//magic for setting up page
if(isset($_GET['article']))
{
include('articlecontroller.php');
}
if(isset($_GET['user']))
{
include('usercontroller.php');
}
?>
Как видите, мой суперконтроллер смотрит на то, что требует эта конкретная страница, и включает в себя необходимые контроллеры, которые выполняют основную работу. NB: Код - быстрый и грязный пример:)
Однако я ни в коем случае не профессионал, поэтому я и спрашиваю вас, ТАК. Какой вариант предпочтительнее? Если ни один из вариантов 3 вы бы не предложили? Любые фрагменты кода / примеры были бы хороши, но не обязательны.
Если вы сделали это так далеко, спасибо за ваше время.
Я думал, что обновлю этот вопрос [и приму ответ - забыл это сделать: P]. Я взглянул на концепцию Fat Models / Skinny Controllers, и мне нравится, как это делается, поэтому я определенно буду следовать этим указаниям.
Я также воспользовался советом, чтобы взглянуть на некоторые другие фреймворки и на то, как они достигают своих паттернов MVC. Есть довольно много, чтобы принять! Тем не менее, я узнал довольно много нового на этом пути, так что это было очень полезно. У меня может быть больше вопросов в будущем, но сейчас у меня более чем достаточно, чтобы начать.
Спасибо всем за ваш вклад.