Скопировать поля меток времени в объекты PEAR Date - PullRequest
0 голосов
/ 11 марта 2011

В моем приложении Symfony / Doctrine я бы хотел, чтобы все поля меток времени в моей базе данных извлекались как объекты PEAR Date вместо строк дат. например Если моя схема

SomeEvent:
   columns:
      id:
         type: integer
         primary: true
      start: timestamp
      end: timestamp

Я бы хотел иметь возможность выполнить запрос Doctrine для извлечения SomeEvent объектов и иметь $anEvent->getStart() быть объектом PEAR Date. Прямо сейчас Doctrine дает мне строки для всех полей меток времени, что в принципе бесполезно. (Я бы также хотел, чтобы сохранение дат работало корректно.)

Какой лучший способ сделать это?

Я исследовал использование слушателя Hydration, но, похоже, мне нужно было зарегистрировать его для каждой таблицы и жестко закодировать имена столбцов, которые я хочу преобразовать. Использование собственного Гидратора не выглядело намного лучше с тех пор, как я утратил способность использовать любой другой метод гидратации ядра без повторения моих дат.

РЕДАКТИРОВАТЬ: Похоже, что Doctrine 2 имеет функцию, которая именно то, что я ищу: Пользовательские типы сопоставления . К сожалению, этот сайт разворачивается на хосте, который не поддерживает PHP 5.3+, поэтому Doctrine 2 отсутствует. (

1 Ответ

0 голосов
/ 15 марта 2011

Я придумала хакерский способ сделать это, которым я не очень доволен, но это работает.Я создал следующие 2 класса:

class DateClassBehavior extends Doctrine_Template {

   public function setTableDefinition() {
      $listener = new DateClassListener();
      $table = $this->getTable();

      foreach ($table->getColumns() as $columnName => $columnDef) {
         if ($columnDef['type'] == 'timestamp') {
            $listener->dateColumns[] = $columnName;
         }
      }

      $this->addListener($listener);
   }

}

class DateClassListener extends Doctrine_Record_Listener {

   public $dateColumns = array();

   public function postHydrate(Doctrine_Event $event) {
      $data = $event->data;

      foreach ($this->dateColumns as $col) {
         $date = $data->$col == null ? null : new Date($data->$col);
         $data->$col = null;
         $data->$col = $date;
      }

      $event->data = $data;
   }

}

И добавил DateClassBehavior к определению для каждой таблицы в моей модели:

SomeEvent:
   actAs: [DateClassBehavior]
   columns:
      id:
         type: integer
         primary: true
      start: timestamp
      end: timestamp

Это обеспечивает создание объектов Date, когда всезагружены.Я также изменил реальный класс PEAR Date (я знаю ... плохо) и добавил метод __toString(), который возвращает $this->getDate().Затем PHP автоматически преобразует даты в правильную строку, когда доктрина сохраняет их.

Если кто-нибудь найдет лучший способ сделать это, пожалуйста, опубликуйте его.

...