"在变革中"的学说责备延期不起作用

Chu*_*ris 6 php onchange symfony stofdoctrineextensions

我正在使用stof Doctrine扩展的symfony 2.6.3.

TimeStampable和SoftDeletable工作得很好.

Blameable"on create"和"on update"也很好用:

/**
 * @var User $createdBy
 *
 * @Gedmo\Blameable(on="create")
 * @ORM\ManyToOne(targetEntity="my\TestBundle\Entity\User")
 * @ORM\JoinColumn(name="createdBy", referencedColumnName="id")
 */
protected $createdBy;

/**
 * @var User $updatedBy
 *
 * @Gedmo\Blameable(on="update")
 * @ORM\ManyToOne(targetEntity="my\TestBundle\Entity\User")
 * @ORM\JoinColumn(name="updatedBy", referencedColumnName="id")
 */
protected $updatedBy;
Run Code Online (Sandbox Code Playgroud)

但"改变"似乎并没有起作用.

/**
 * @var User $deletedBy
 *
 * @Gedmo\Blameable(on="change", field="deletedAt")
 * @ORM\ManyToOne(targetEntity="my\UserBundle\Entity\User")
 * @ORM\JoinColumn(name="deletedBy", referencedColumnName="id")
 */
protected $deletedBy;
Run Code Online (Sandbox Code Playgroud)

我在"deletedAt"字段上配置了SoftDeletable.SoftDeletable工作正常,但deletedBy从未填充.

我怎样才能让它发挥作用?我只想设置删除实体的用户ID.

nat*_*nko 1

问题是当您调用实体(设置用户)时,您想要更新实体(设置用户)的删除方法。

\n\n

目前可能还没有一个完美的解决方案来注册使用 Softdeleteable + Blameable 扩展软删除对象的用户。

\n\n

一些想法可能是覆盖 SoftDeleteableListener (https://github.com/Atlantic18/DoctrineExtensions/blob/master/lib/Gedmo/SoftDeleteable/SoftDeleteableListener.php),但我在执行此操作时遇到了问题。

\n\n

我当前的工作解决方案是使用实体侦听器解析器。

\n\n

MyEntity.php

\n\n
/**\n* @ORM\\EntityListeners({\xe2\x80\x9eAcme\\MyBundle\\Entity\\Listener\\MyEntityListener" })\n*/\n\nclass MyEntity {\n\n/**\n* @ORM\\ManyToOne(targetEntity="Acme\\UserBundle\\Entity\\User")\n* @ORM\\JoinColumn(name="deleted_by", referencedColumnName="id")\n*/\nprivate $deletedBy;\n\npublic function getDeletedBy()\n{\n    return $this->deletedBy;\n}\n\npublic function setDeletedBy($deletedBy)\n{\n    $this->deletedBy = $deletedBy;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

MyEntityListener.php

\n\n
use Doctrine\\ORM\\Event\\LifecycleEventArgs;\nuse Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\TokenStorageInterface;\nuse Acme\\MyBundle\\Entity\\MyEntity;\n\nclass MyEntityListener\n{\n/**\n * @var TokenStorageInterface\n */\nprivate $token_storage;\n\npublic function __construct(TokenStorageInterface $token_storage)\n{\n    $this->token_storage = $token_storage;\n}\n\npublic function preRemove(MyEntity $myentity, LifecycleEventArgs $event)\n{\n    $token = $this->token_storage->getToken();\n    if (null !== $token) {\n        $entityManager = $event->getObjectManager();\n        $myentity->setDeletedBy($token->getUser());\n        $entityManager->persist($myentity);\n        $entityManager->flush();\n    }\n}\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里的一个缺陷是调用flush方法。

\n\n

注册服务:

\n\n
services:\n    myentity.listener.resolver:\n        class: Acme\\MyBundle\\Entity\\Listener\\MyEntityListener\n        arguments:\n            - @security.token_storage\n        tags:\n            - { name: doctrine.orm.entity_listener, event: preRemove }\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新composer.json中的doctrine/doctrine-bundle:

\n\n
"doctrine/doctrine-bundle": "1.3.x-dev"\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您有任何其他解决方案,特别是有关 SoftDeleteableListener 的解决方案,请在此发布。

\n