2010-09-14 2 views
9

Я получаю данные от модели (массив с данными), и мне нужно отображать в определенном формате. Мне нужно перебирать массив, форматировать данные, а затем отображать их. Где я должен форматировать данные для отображения? В модели, контроллере или представлении? Спасибо.MVC: Где я должен форматировать данные?

+0

Как вы хотите. Но лучше в контроллере. – pltvs

+0

@ Александр не ответственность диспетчера. – Gordon

+1

@ Я делаю это в контроллере ... – jared

ответ

5

Итерация по массиву и отображение данных выполняется в представлении. Поэтому я бы также сделал форматирование в представлении. Если форматирование является сложным и/или требует большого количества кода, поместите его в вспомогательную функцию.

Например:

Вид:

<?php foreach($array as $item): ?> 
    <p><?php echo format_function($item); ?></p> 
<?php endforeach; ?> 

Helper:

function format_function($text) 
{ 
    // Do some formatting here... 
    return $formatted_text; 
} 
+0

Функция помощника звучит хорошо :) – jared

+4

НЕ загрязняйте свой взгляд таким дерьмом. Представление не отвечает за форматирование. Попытайтесь использовать отдельный слой, который отвечает за форматирование/преобразование вашей объектной модели в дружелюбную модель представления. Как сказал Стефанвдс в .NET, существует сопоставление объекта-объекта с именем AutoMapper, возможно, есть эквивалент в php. – Rookian

+0

Я не согласен. Каждая инфраструктура MVC, которую я знаю, имеет встроенную поддержку для этого. Если не для таких случаев, то для чего я должен использовать помощников? Ваше решение может быть более «чистым», но в этом простом случае я чувствую, что добавление другого слоя переусердствует. – Mischa

2

если ваш ViewData имеет данные из разных моделей, или имеет только избранную часть 1 модели, вы можете создайте ViewModel, который затем можно сопоставить с Automapper.

ViewModels имеет ряд преимуществ. Они понятны для работы, Unclutter данные, могут добавить безопасность, ...

+0

любые ссылки с деталями на этот шаблон? – Gordon

+0

@ Gordon: http://en.wikipedia.org/wiki/View_model? – fabrik

+0

@fabrik Для других целей см. [Просмотр модели (значения)] (http://en.wikipedia.org/wiki/View_model_%28disambiguation%29). Никогда не бойтесь иметь ссылку при обращении к шаблону. – Gordon

2

Вы можете сделать это в View.Not в модели В View вы можете сделать конкретную операцию (преобразовывая/условия /)

2

Если вы работаете над большим проектом, я бы предложил вам добавить дополнительный слой или класс, который отвечает за преобразование вашего объекта (то есть объекта модели домена) в объект передачи данных (объект модели представления).

В противном случае применять предложения делать форматирование в представлении :)

трансформирующей может быть связан с строкой форматирования, десятичные (валюта), DateTimes и так далее. Также можно преобразовать граф объектов (посмотрите на мой пример) в плоскость DTO.

Контроллер будет отвечать за вызов алгоритма отображения.

Таким образом, вы не должны перебирать ссылки на свой объект. Вместо этого вы используете плоскую хорошо отформатированную модель представления.

Ваш взгляд не будет загромождать и выглядит очень чистым.

Инструмент, который выполняет это преобразование, доступен в мире .NET. Он называется AutoMapper. Возможно, в PHP есть эквивалент.

Вот пример

Это объектная модель: alt text

Вы могли бы превратить его в этой умной модели представления:

alt text

Преимущества этого подход:

  • разделения ответственности

  • чистые зрения

  • Нет код дупликации, т.е. форматирование DateTime в каждом представлении. (Не повторяться!)

К недостаткам этого подхода:

  • дорого для начала, так мало проектов, не прибыль от этого подхода
1

Do это в вашем представлении, поскольку оно отвечает за презентацию.

Причина

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

См MVC background reading

2

презентации! = форматирование данных. Пожалуйста, рассмотрите следующий пример:

Международный магазин с продуктовой страницей, с различной информацией относительно размеров продукта и т. Д. Из-за международного характера магазина эти данные должны быть отформатированы по-разному для каждого региона, в котором посещают магазин. Например: В Европе измерения показаны как значения показателей, тогда как клиенты из США видят те же данные, что и имперские значения.

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

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

Другим важным аспектом такого способа обработки форматирования данных является то, что ваши данные все равно будут правильно отформатированы при попытке получить набор данных с помощью действия без представления (т. Е. Объекта JSON, полученного через AJAX). Данные, которые отправляются обратно клиенту любым способом (через «обычный» HTML-шаблон или как строку JSON/XML), не должны отличаться; только то, как оно представлено .

+0

Согласовано. SoC несет ответственность и, как правило, в архитектуре представления с пассивным представлением (например, MVP-вариация, MVVM, MVPVM и т. Д.), Ответственность за форматирование/подготовку данных не несет ответственности. Это будет презентатор/viewmodel, а в случае более MVP-стиля ASP.Net MVC, например, контроллер еще лучше, vm). Пассивность увеличивает тестирование/повторное использование, сохраняет логику бизнеса вне представления. И последний пара сделал замечательный момент, о котором я не думал, что также означает, что «форматированный» не имеет средств, отформатированных для просмотра. – user1172173

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