Создание и объединение контроллеров в веб-приложении MVC PHP - PullRequest
0 голосов
/ 13 июля 2009

В течение последних нескольких недель я изучал шаблон проектирования MVC для веб-приложений, использующих PHP. В целом я понимаю, как работает этот шаблон и почему он является очень хорошим способом реализации любого вида веб-приложений, от маленьких до больших.

Насколько я понимаю, у нас есть 3 различных слоя, которые общаются друг с другом через контроллер, например:

Пользовательский ввод ---> Вид ---> Контроллер ---> Модель

Выход сайта <--- Вид <--- Контроллер <--- Модель </p>

С моим запланированным внедрением я надеюсь иметь модель для каждой таблицы в моей базе данных, и каждая модель будет иметь все функции / логику, необходимые для управления этой таблицей. В свою очередь каждая из этих моделей будет иметь связанный вид. Модель и представление, конечно, будут иметь контроллер, который позволяет их использовать.

Теперь это легко осознать, поскольку каждое логическое действие, требующее базы данных, покрыто. Однако, что происходит, когда конкретное действие требует использования более одной таблицы / модели?

Административной стороне приложения вряд ли понадобится более одной модели за один раз для обслуживания базы данных. Внешний интерфейс или пользовательская часть приложения - это другое дело! Скажем, у меня есть веб-страница, на которой показан список статей для определенного раздела, список зарегистрированных в настоящее время пользователей и - заимствование примера из SO - статистика сайта, такая как облако тегов.

Эта страница потребует как минимум 3 модели в моем запланированном дизайне - статья, пользователи и теги.

Очевидно, что мои единственные контролеры не собираются сокращать это. Так что мне делать?

  1. Создать новые монолитные контроллеры для моих веб-страниц?

    • позвольте мне получить желаемый результат
    • потребует много повторяющихся кодов
    • очень сложно поддерживать, если требуются изменения
  2. Создание «супер» контроллера, который манипулирует меньшими конкретными контроллерами

    • позволяет мне получить желаемый результат
    • будет модульным, поэтому изменения в одном скрипте не должны влиять на другие
    • минимальное дублирование кода
  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. Есть довольно много, чтобы принять! Тем не менее, я узнал довольно много нового на этом пути, так что это было очень полезно. У меня может быть больше вопросов в будущем, но сейчас у меня более чем достаточно, чтобы начать.

Спасибо всем за ваш вклад.

Ответы [ 3 ]

6 голосов
/ 13 июля 2009

Я не согласен с тем направлением, которое вы хотите использовать в своей модели. Дизайн стола 1 модель = 1 навредит вам в долгосрочной перспективе.

Прежде всего, я думаю, что вам нужно отбросить строгое представление о том, что модель == база данных. Хотя это очень часто так, на самом деле модель - это просто данные - они могут быть из файлов XML, кэша или даже веб-службы.

Проверьте этот превосходный ответ Билл Карвин - он очень хорошо решает эти проблемы.

Во-вторых, почитайте на тему толстые модели, тощие контроллеры (или тонкие контроллеры )

Наконец, так же, как и к вашему сведению, ваша идея «суперконтроллера» - это то, что более известно как «фронт-контроллер»

2 голосов
/ 13 июля 2009

Вы действительно должны взглянуть на PHP MVC фреймворки там. Они уже все это выяснили. Они будут иметь маршрутизацию URL (/ article / edit / 1), хорошее разделение MVC и отличные документы, чтобы помочь вам в этом. Таким образом, вместо того, чтобы беспокоиться о том, как вызвать представление из контроллера, вы можете подумать о своем приложении. Я лично сэкономил тонн времени, когда, наконец, совершил погружение.

  • Zend MVC framework (мой личный фаворит, используйте столько, сколько вам нужно)
  • Symfony
  • Codeigniter
  • CakePHP (я ненавижу его жесткую структуру, но некоторые люди обожают его)

Есть много других там.

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

1 голос
/ 13 июля 2009

Создание собственного фреймворка отлично подходит для того, чтобы больше узнать о шаблонах проектирования, дизайне и узнать больше о php.

Но сделайте так, как предлагает Байрон, и просмотрите исходный код некоторых фреймворков mvc только для того, чтобы понять, как они реализовали паттерн mvc. Возьмите что-то из Zend Framework, затем возьмите что-нибудь из CakePHP, и в конце концов у вас будет что-то, что будет работать для вас, и вы тоже чему-то научитесь (ПРИМЕЧАНИЕ: не копируйте код, просто получите идею !!)

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

Удачи !!

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