如何处理生命周期回调
有时候你可能需要在一个实体被创建,更新或者删除的前后执行一些操作。这些操作方法处在一个实体不同的生命周期阶段,所以这些行为被称为”生命周期回调“。
如果你用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的事件生命周期。