in Профессиональное

Doctrine2: эмулируем timestampable behavior через lifecycle callback

Ниже рассмотрим простой, но имхо нужный пример по реализации аналога timestampable в Doctrine2.


Схема:

Vendor\MyBundle\Entity\User:
  type: entity
  table: user
  id:
    id:
      type: bigint
      generator:
        strategy: AUTO
  fields:
    # ...
    updated:
      type: datetime
      nullable: true
    created:
      type: datetime
      nullable: true

Далее полагаем что сущности сгенерированы. При создании новой сущности вызывается констуктор, поэтому даты устанавливаем там:

<?php
// Vendor/MyBundle/Entity/User.php
class User{
    // ....    
    /**
     * @var datetime $created
     */
    private $created;
 
    /**
     * @var datetime $updated
     */
    private $updated;
 
    public function __construct()
    {
        $this->created = $this->updated = new \DateTime("now");
    }
    // ....    
}

Для того чтобы при обновлении сущности updated также обновлялся бы, нам надо воспользоваться lifecycle callback. Модифицируем схему и генерим по ней модель:

Vendor\MyBundle\Entity\User:
  type: entity
  table: user
  # ...
  lifecycleCallbacks:
    preUpdate: [ preUpdate ]

После генерации у вас в классе сущности появится метод preUpdate, который надо слегка модифицировать:

<?php
// Vendor/MyBundle/Entity/User.php
class User{
    // ....    
    /**
     * @orm:preUpdate
     */
    public function preUpdate()
    {
        $this->updated = new \DateTime("now");
    }
    // ....    
}

Берем и пользуемся )

Источник: http://www.doctrine-project.org/blog/doctrine2-behaviours-nutshell. Посмотрите, там еще много интересного.

Write a Comment

Comment

*