如何处理生命周期回调

3.4 版本
维护中的版本

有时候你可能需要在一个实体被创建,更新或者删除的前后执行一些操作。这些操作方法处在一个实体不同的生命周期阶段,所以这些行为被称为”生命周期回调“。

如果你用annotations方式,开启一个生命周期回调,需要如下设置:(如果你不喜欢你也可以使用yaml和xml方式)

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

现在你可以告诉Doctrine在任何可用的生命周期事件上来执行一个方法了。比如,假设你想在一个新的实体第一次被创建时设置创建日期列(created)为当前日期。

1
2
3
4
5
6
7
8
9
// src/AppBundle/Entity/Product.php
 
/**
 * @ORM\PrePersist
 */
public function setCreatedAtValue()
{
    $this->createdAt = new \DateTime();
}
1
2
3
4
5
6
# src/AppBundle/Resources/config/doctrine/Product.orm.yml
AppBundle\Entity\Product:
    type: entity
    # ...
    lifecycleCallbacks:
        prePersist: [setCreatedAtValue]
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>

上面的例子假设你已经创建了createdAt属性(为在此处显示)。

现在在实体第一次被保存时,Doctrine会自动调用这个方法使createdAt 字段自动设置为当前日期。

还有一些其他的生命周期事件,你可以使用它。更多生命周期事件和生命周期回调,请查看Doctrine的事件生命周期

生命周期回调和事件监听

注意到setCreatedValue()方法不需要接收任何参数。这是生命周期回调通常的做法和惯例:生命周期回调应该是简单方法,更关注于实体内部传输数据。比如设置一个创建/更新字段,生成一个定量值等。

如果你需要一些比较大的行为活动,像执行日志或者发送邮件,你应该注册一个扩展类作为事件监听器或接收器给它赋予访问所需资源的权利。想了解更多,请参阅 如何注册事件监听和订阅器.

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)