2010-04-12 4 views
6

Я читал о дизайне MVC какое-то время, и кажется, что представление View вызывает объекты и методы в модели, создает и выводит представление.MVC: Model View Controller - просматривает ли Вид модель?

Я думаю, что это в основном неправильно.

Контроллер должен действовать и получать/обновлять объекты внутри модели, выбирать соответствующий вид и передавать ему информацию, чтобы он отображался. В представлении должны отображаться только грубые и рудиментарные переменные PHP/простые операторы if.

Если представление получает информацию, необходимую для отображения с модели, то, конечно, внутри представления будет много PHP. Это полностью нарушает точку разделения логики представления.

ответ

8

Как и все программирование, мы должны быть прагматичными. Представление должно содержать только логику представления. Эта логика может быть очень простой или может быть довольно сложной. Пока эта логика обрабатывает только то, что отображается на экране, распечатывается в отчете и т. Д.

Контроллер должен действовать и извлекать/обновлять объекты внутри Модели, выбирать соответствующий Просмотр и передавать ему информацию поэтому он может отображаться.

Какова информация, которую вы передаете? Возможно подмножество модели. Вы можете создать новый класс, содержащий только информацию, которую должен знать или просто пройти по модели, и убедитесь, что вы только получаете доступ к соответствующим данным. Во всяком случае, представление должно быть бесплатным, чтобы запросить это переданное в модели, чтобы иметь возможность отображать представление.

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

Будьте прагматичны!

1

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

Обновление У этого post есть также хорошие примеры. Модель - это двигатель автомобиля с похожими методами start(), вид - это цвет автомобиля с методами paint() или change(), а контроллер - это драйвер. Я предпочитаю, чтобы контроллер управлял() автомобилем и запускал() двигатель вместо того, чтобы пропускать колеса или краску.

:)

+0

Я думаю, что лучше, чтобы увидеть, как вид более шаблона. MVT, как мне нравится это видеть. Единственный недостаток в том, что информация, полученная от контроллера и переданная в представление, заключается в том, что вид теперь зависит от контроллера. Вид не может быть вызван непосредственно для отображения страницы, он должен пройти через контроллер, но опять же, это целая * цель * контроллера - для маршрутизации запросов HTTP GET/POST. –

+1

«Лично я не разрешаю виду читать непосредственно из модели». - Также при использовании AJAX? –

+1

@ Mr.Pallazzo также. Запросы Ajax все еще обрабатываются контроллером, а не непосредственно моделью. Нет принципиальной разницы с точки зрения сервера между обычным запросом и Ajax. Разница заключается в выходе и в клиенте. –

9

Существует не один абсолютный и правильный способ сделать MVC. Возможны вариации.

Например, вместо того, чтобы View активно запрашивал модель, контроллер может уведомлять обо всех изменениях в Модели, используя какой-либо механизм уведомления. В этом случае View просто прослушивает обновления, которые затем отображаются.

1

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

Обычно я не трачу слишком много усилий на разделение контроллера. Разделение между моделью и (вид контроллера) гораздо важнее.

+0

Очень важно отделить функции модели от контроллера и просмотров, но я думаю, что это относительно прямолинейно, зная, что принадлежит модели; все, что связано с данными, логикой бизнеса, валидацией и т. д. Теперь линия между представлением и контроллером вы можете легко получить код spagehetti. –

1

Я думаю, что вы абсолютно правы. Мнения не должны вызывать методы из моделей. Как говорят другие, существуют вариации на MVC, но это указывает на то, чтобы отделить логику от данных с выхода.

Как правило, у вас есть контроллер, который является начальной точкой для приложения. В PHP это будет ваш файл index.php. Как минимум, этот файл обрабатывал входные данные (т. Е. Строку запроса или параметры URL). Обычно рекомендуется добавлять отдельные контроллеры для отдельных частей приложения.

Каждый контроллер затем просто решает, какие данные нужно отображать, получает из модели и передает его в представление. В PHP вы бы назвали различные классы/методы, которые извлекают данные из базы данных, сохраняя их в переменных.

Затем вы просто включаете в себя еще один PHP-файл, содержащий в основном HTML, но с некоторыми PHP-эхо-переменными. Петли тоже прекрасны.Если у вас есть список вещей, которые вы можете сделать что-то вроде этого:

<ul> 
<?php foreach ($items as $item) : ?> 
    <li><?=$item?></li> 
<?php endforeach; ?> 
</ul> 
3

Это, вероятно, не то, что можно было бы назвать «чистым» MVC, но ИМХО это не огромная сделка до тех пор, как вид PHP кода не мутирует модель. Наиболее важным правилом MVC является то, что модель не знает о представлении. Не менее важно иметь представление о модели.

Основной недостаток использования модели заключается в том, что представление нельзя использовать повторно с другой моделью. Это редко бывает проблемой, поскольку представление почти всегда относится к одному типу модельного объекта (или к его списку).

2

Будут ли следующие изменения к DisgruntledGoat's code snippet считаться слишком «сложными»? Должны ли объекты передаваться в представление?

<li><?=$item->description?></li> 

А может быть?

<li><?=$item->getDescription()?></li> 

Я видел несколько примеров, в которых используются только массивы: -

<li><?=$item['description']?></li> 
+0

Передача объекта или переменной - это просто предпочтительный дизайн, хотя я бы переместился к массиву, потому что не все мои данные, переданные в представление, будут уже в форме объекта. Мне нравится держать вещи в соответствии с моими взглядами, выбирать либо всегда передавать объекты или массивы. Для 'getDescription()' Я бы сказал, что это зависит от того, что на самом деле делает getDescription. Если он использует вспомогательную функцию только для * форматирования * кода сложным образом, тогда это нормально. Хотя, если это вызывает запрос SQL, это не очень хорошая идея; это задача контроллера для получения данных с моделей. –

+0

Спасибо за ответ. Думал о том, что контроллер передает данные для просмотра как объекты, а не массивы, а затем результирующая «ползучая» сложность (доступ к публичным атрибутам заменяется методами) php, когда совет, похоже, поддерживает PHP просто. – Gammerz

Смежные вопросы