2016-07-21 8 views
0

В проекте Symfony2, я использую пользовательский Doctrine типа «UnixTime» для отображения полей даты хранятся в виде меток времени UNIX в унаследованной базе данных:Доктрина Timestampable на пользовательский тип поля в Symfony2

/** 
* @var \DateTime 
* @ORM\Column(name="created", type="unixtime", nullable=false) 
*/ 
private $created; 

Теперь я нравится использовать DoctrineExtensions и stof/doctrine-extensions-bundle установить это свойство автоматически добавляя:

* @Gedmo\Timestampable(on="create") 

Но это приводит к исключению, поскольку «UnixTime» не входит в число $validTypes в Gedmo\Timestampable\Mapping\Driver\Annotation в:

Field - [created] type is not valid and must be 'date', 'datetime' or 'time' in class ... 

Когда я добавляю 'unixtime' непосредственно к этому массиву допустимых типов, все работает нормально.

Что было бы самым лучшим и наименее навязчивым способом заставить обработчик Timestampable работать с моим собственным типом? Есть ли способ настроить это? Нужно ли мне подкласс?

+0

ли вы попробовать 'timestamp' тип https://github.com/Atlantic18/DoctrineExtensions/blob/master/ Библиотека/Gedmo/Timestampable/Mapping/Driver/Annotation.php # L34? – Callistino

+0

Сопоставление как 'timestamp' на самом деле * кажется * работать, хотя я не уверен, почему. Я бы ожидал, что Doctrine преобразует объект DateTime в строку, форматированную как «Y-m-d H: i: s» при построении SQL. Конечно, я бы предпочел сохранить собственный тип. Тем не менее, это может быть жизнеспособным решением. –

+0

Как оказалось, «временная метка» считалась рабочей, потому что она не использовалась преобразователем. После того, как я очистил свой кэш, «timestamp» был неизвестным типом доктрины. –

ответ

0

После некоторых обширных исследований я придумал решение, которое работает для меня. Не так изящно, как я бы надеялся, но я все равно хотел бы поделиться.

Во-первых, я зарегистрировал свой собственный TimestampableListener:

stof_doctrine_extensions: 
    class: 
     timestampable: MyProject\TimestampableListener 

... переопределить getNamespace():

namespace MyProject; 
class TimestampableListener extends \Gedmo\Timestampable\TimestampableListener 
{ 
    protected function getNamespace() 
    { 
     return __NAMESPACE__; 
    } 
} 

Это заставит DoctrineExtensions загрузить драйвер отображения аннотаций из моего пространства имен, а также , поэтому я могу расширить его и добавить свой собственный тип в список разрешенных типов:

namespace MyProject\Mapping\Driver; 
class Annotation extends \Gedmo\Timestampable\Mapping\Driver\Annotation 
{ 
    protected $validTypes = array(
     'date', 'time', 'datetime', 'datetimetz', 'timestamp', 
     'zenddate', 'vardatetime', 'integer', 
     // our custom field type: 
     'unixtime', 
    ); 
} 

К сожалению, это также приведет к загрузке соответствующего адаптера поля из моего пространства имен. Поэтому я должен добавить это тоже. И так как исходный класс адаптера объявлен final, я в основном вынуждены копировать реализацию:

namespace MyProject\Mapping\Event\Adapter; 
final class ORM extends BaseAdapterORM implements TimestampableAdapter 
{ 
    public function getDateValue($meta, $field) 
    { 
     // code from Gedmo\Timestampable\Mapping\Event\Adapter::getDateValue() 
     ... 
    } 
} 

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

  • Нет связанных вопросов^_^