我有一个实体监听器,如果用户更改了记录,则将updatedAt字段设置为当前时间。
然而现在需求已经改变,我需要运行一个脚本并立即更新所有实体,但不应该弄乱用户生成的updatedAt-field。
所以我想构建一个更新所有实体的命令,但不应更新updatedAt-field。
我想知道如何通过这样的参数。
目前我想知道是否应该在实体上添加doUpdateUpdatedAt字段,并且对于命令将其设置为false。但我想知道是否有不同的方式。我认为如果设置updatedAt-field,资产不应该被关注,我认为这应该在我持久化实体或刷新时发生。
我希望对有什么可能性以及它们的优缺点有一些反馈。
答案 0 :(得分:0)
侦听器已注册为服务,这意味着可以通过容器轻松地在命令中访问它并设置所需的属性:
class UpdateAssetCategoryCountCommand extends AbstractCommand
{
...
protected function execute(InputInterface $input, OutputInterface $output)
{
$assets = $this->findAllAssets();
$em = $this->getEntityManager();
$listener = $this->getContainer()->get('my.listener');
$listener->doNotUpdateTimeStamp();
foreach ($assets as $asset) {
// change the required fields
$em->persist($asset);
}
$em->flush();
}
在我的听众中:
class MyListener implements EventSubscriber
{
/**
* @var bool
*/
private $shouldUpdateTimestamp = true;
...
public function preUpdate(LifecycleEventArgs $arg)
{
$entity = $arg->getObject();
$em = $arg->getEntityManager();
if ($entity instanceof Asset) {
$entity->updateCategoryCount();
$entity->preUploadHandlerIfFileUploaded();
if ($this->shouldUpdateTimestamp) {
$entity->setUpdatedAt(new DateTime('now'));
}
$this->persistChanges($em, $entity);
}
public function doNotUpdateTimeStamp()
{
$this->shouldUpdateTimestamp = false;
}
}