MVC: Где я должен отформатировать данные? - PullRequest
9 голосов
/ 14 сентября 2010

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

Ответы [ 6 ]

5 голосов
/ 14 сентября 2010

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

Например:

Вид:

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

Помощник:

function format_function($text)
{
    // Do some formatting here...
    return $formatted_text;
}
2 голосов
/ 02 августа 2012

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

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

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

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

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

2 голосов
/ 14 сентября 2010

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

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

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

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

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

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

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

Вот пример

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

Вы можете преобразовать его вЭта модель Smart View:

alt text

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

  • разделение проблем

  • чистый вид

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

Недостатки этого подхода:

  • дорого для начала, поэтому мало проектовне выгодно при таком подходе
2 голосов
/ 14 сентября 2010

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

2 голосов
/ 14 сентября 2010

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

ViewModels имеют несколько преимуществ. С ними легко работать, они могут загромождать ваши данные, могут повысить безопасность, ...

1 голос
/ 15 сентября 2010

Сделайте это в своем представлении, так как оно отвечает за презентацию.

причина

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

См. Фоновое чтение MVC

...