18

私は自分のエンティティにこのメソッドを持っています:

/**
     * @ORM\PreUpdate()
     * @ORM\PrePersist()
     */
    public function preStore() {
        if ($this->getPictureFile()) {
            $newFilename = sha1(mt_rand());
            $newFilename = $newFilename . '.' . ($this->getPictureFile()->guessExtension());
            $this->setPictureFilename($newFilename);
        }
    }

そして、オブジェクトを永続化するとすべてが完全に機能しますが、更新時にメソッドがまったくトリガーされないため、次のようにテストしました:

/**
     * @ORM\PreUpdate()
     * @ORM\PrePersist()
     */
    public function preStore() { var_dump('asdasdasdadsdasdas');
        if ($this->getPictureFile()) {
            $newFilename = sha1(mt_rand());
            $newFilename = $newFilename . '.' . ($this->getPictureFile()->guessExtension());
            $this->setPictureFilename($newFilename);
        }
    }

そして、var_dumpの永続化では機能しますが、オブジェクトを更新すると機能しません。なんで?

4

4 に答える 4

10

エンティティにライフサイクル コールバックがあることを教義に明示的に伝える必要があります。

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class YourClass

()さらに、オプションを提供しない場合、注釈の末尾は必要ありません。

/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
 */
public function preStore()

ライフサイクルコールバックの代わりにリスナー/サブスクライバーを使用することを検討してください。これにより、再利用が容易になり、エンティティをクリーンに保つことができます。

詳細については、クックブックの章How to Register Event Listeners and Subscribers を参照してください。

于 2013-06-29T15:08:41.927 に答える
3

私は同じ問題に遭遇しました、ここに私の解決策があります:

マップされたフィールドを追加し、エンティティの内部でupdatedAt呼び出すだけで、これがトリガーされますsetUpdatedAt(new \DateTime())setterUploadedFilepreUpdate-Event

于 2015-11-20T13:56:44.870 に答える
0

これが失敗するもう 1 つの理由は、アスタリスクが 1 つしかない場合です。

失敗: /* @ORM\PrePersist */

成功: /** @ORM\PrePersist */

ばかげていますが、そこにあります..

于 2015-08-12T20:45:21.953 に答える