Как работать с Callback жизненного цикла

Иногда вам может понадобиться выполнить действия прямо до или после вставки, обновления или удаления сущности. Такие типы событий известны как callback "жизненного цикла", так как они являются callback-методами, которые вам нужно выполнить во время разных стадий жизненного цикла сущности (например, когда сущность вставляется, обновляется, удаляется и т.д.).

Если вы используете аннотации для своих метаданных, начните с активации callback жизненного цикла. Это не обязательно, если вы используете YAML или XML для вашего отображения.

1
2
3
4
5
6
7
8
/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks()
 */
class Product
{
    // ...
}

Теперь вы можете сказать Doctrine применить метод к любым доступным событиям жизненного цикла. Например, представьте, что вы хотите сделать так, чтобы в столбце дат createdAt появлялась текущая дата только тогда, когда сушность спервые сохраняется (т.е. вставляется):

  • Annotations
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // src/AppBundle/Entity/Product.php
    
    /**
     * @ORM\PrePersist
     */
    public function setCreatedAtValue()
    {
        $this->createdAt = new \DateTime();
    }
    
  • YAML
    1
    2
    3
    4
    5
    6
    # src/AppBundle/Resources/config/doctrine/Product.orm.yml
    AppBundle\Entity\Product:
        type: entity
        # ...
        lifecycleCallbacks:
            prePersist: [setCreatedAtValue]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- src/AppBundle/Resources/config/doctrine/Product.orm.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
            http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
    
        <entity name="AppBundle\Entity\Product">
            <!-- ... -->
            <lifecycle-callbacks>
                <lifecycle-callback type="prePersist" method="setCreatedAtValue" />
            </lifecycle-callbacks>
        </entity>
    </doctrine-mapping>
    

Note

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

Теперь, прямо перед тем, как сущность будет впервые сохраняться, Doctrine автоматически вызовет этот метод и в поле createdAt будет установлена текущая дата.

Существуют ещё некототорые другие события жизненного цикла, к которым это можно применить. Чтобы узнать больше информации о других событиях жизненного цикла и callback жизненного цикла в общем, см. Документацию событий жизненного цикла Doctrine.

Заметьте, что метод setCreatedAtValue() не принимает никаких аргументов. Так всегда происходит с callback жизненного цикла и это намеренно: callbacks жизненного цикла должны быть простыми методами, которые заняты внутренней трансформацией данных в сущности (например, установка созданного/обновлённого поля, создание значения slug).

Если вам нужно выполнить более сложные задачи - например, вести логи или отправить электронное письмо - вам нужно зарегистрировать внешний класс в качестве слушателя или подписчика событий и дать ему доступ к любым необходимым вам ресурсам. Чтобы узнать больше об этом, см. Doctrine Event Listeners and Subscribers.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.