Должен ли я конвертировать мою метку времени в моем контроллере или представлении (CakePHP)? - PullRequest
3 голосов
/ 08 апреля 2011

Я работаю над пониманием лучших практик для MVC (используя CakePHP) и пытаюсь понять, должна ли определенная задача происходить в контроллере или в представлении .

Вот сценарий:

У меня есть таблица пользователей. С каждым пользователем связано много событий.

В моем контроллере я загружаю контент о пользователе в массив следующим образом:

$this->set('user', $this->User->read());    

В результате получается пользовательский массив, который я могу перебрать на странице просмотра:

Array
(
    [User] => Array
        (
            [id] => 1
            [name] => Jane Doe
            [created] => 2011-03-29 15:50:25
            [modified] => 1301428225
        )

    [Event] => Array
        (
            [0] => Array
                (
                    [id] => 4
                    [user_id] => 1
                    [title] => Birthday
                    [created] => 2011-04-07 17:28:53
                    [modified] => 2011-04-07 17:28:53
                    [occured] => 1301889600
                )

            [1] => Array
                (
                    [id] => 3
                    [user_id] => 1
                    [title] => Anniversary
                    [created] => 2011-04-07 17:21:27
                    [modified] => 2011-04-07 17:21:27
                    [occured] => 1301976000
                )

            [2] => Array
                (
                    [id] => 2
                    [user_id] => 1
                    [title] => Graduation
                    [created] => 2011-04-07 17:20:41
                    [modified] => 2011-04-07 17:20:41
                    [occured] => 1301889600
                )
        )

Теперь произошла временная метка, которую мне нужно преобразовать в дружественную дату.

Должен ли я:

А) Делать это в контроллере? Если да, то какой синтаксис лучше всего копать в массив и делать это?

Б) Делать это в представлении, когда он называется?

<?=date("d/m/Y,$thisEvent['occured']);?>

Последний кажется чище с меньшим количеством кода, но я не знаю, может ли это логика, которую я могу / должен применять из контроллера.

Ответы [ 3 ]

6 голосов
/ 08 апреля 2011

Если вы все равно собираетесь циклически проходить по массиву в представлении для отображения событий, я бы просто поместил преобразование в представление, чтобы избавить от необходимости также зацикливаться в контроллере.

Для меня форматирование даты - это презентация, а не бизнес-логика.

Amy

3 голосов
/ 12 апреля 2011

Эмпирическое правило таково: от жирной модели к худому виду.Представление не должно обрабатывать логику.Период.Представление не должно обрабатывать изменение данных, оно должно обрабатывать только его отображение.Модель - это место, где должны осуществляться манипуляции с данными.Но иногда, как программисты, мы хотим выбрать самый простой способ.Что не обязательно неправильно, но не всегда лучший способ сделать что-то.

Мой совет один из следующих (в порядке предпочтения):

1- Измените формат даты в базе данных, чтобы он отображался в том формате, который вы ищете.Тогда для форматирования даты не требуется дополнительная логика.

2- Запишите запрос как объединение.(Что вы должны делать в этом случае, так как рекурсивный режим включен).Напишите объединение, чтобы данные возвращались в формате, как вы ожидаете.Проблема в том, что вы используете ярлык, используя $ this-> User-Read (), что заставляет вас писать дополнительную логику вне модели для обработки форматирования дат.Model-> read () имеет свои применения, но это не один из них.

3 - Если вы хотите использовать ярлык Model-> read (), вы можете создать помощника по дате, который вы сможетессылка с точки зрения на любую дату.Например, когда вы отображаете поле в представлении, вы должны вызвать:

<?php echo $this->Date->format($thisEvent['occured']); ?>

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

function format($date) {
   return date('d/m/Y', strtotime($date));
}

Таким образом, если вы когда-либо решите, что хотите изменить вид дат, вам нужно всего лишь изменить помощника (1 место) вместо всех видов (несколько мест).

0 голосов
/ 25 июня 2012

Я бы предложил, чтобы:

  • Модели возвращают DateTime объекты или аналогичные. Таким образом, в Контроллерах или Представлениях может быть легко выполнять вычисления / форматирование по датам, когда это необходимо (хорошая ремонтопригодность).

  • Представления , как сказано в другом ответе, должны быть максимально простыми (удобочитаемость). Благодаря Smarty +, работающему с конкретными объектами DateTime , я могу просто написать {$someItem.someDate} в Views , и даты будут автоматически отформатированы (в соответствии с языком текущего пользователя) с использованием __toString() метод моего конкретного DateTime класса.

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