1

Doctrine2 のセットアップはすべて YAML ファイル内で行われます。私は prePersist 関数を実行しようとしている LoanAppMenuProgress という名前のエンティティ クラスを持っています。この LoanAppMenuProgress エンティティには、LoanApp という名前の別のクラスとの oneToOne 関係があります。DB 内の LoanApp テーブルに関連付けられた LoanAppMenuProgress テーブルには、外部キーの関連付けがあります。

LoanApp.LoanAppMenuProgress.orm.yml の LoanAppMenuProgress クラスの構成は次のとおりです。

LoanEv\LoanAppBundle\Entity\LoanApp\LoanAppMenuProgress:
  type:  entity
  repositoryClass: LoanEv\LoanAppBundle\Repository\LoanApp\LoanAppMenuProgress
  table: loan_app_menu_progress
  id:
    id:
      type: integer
      generator: { strategy: auto }

### This is the OWNING side of the relationship
  oneToOne:
    loan_app:
      targetEntity: LoanApp
      inversedBy: loanapp_menu
      joinColumn:
        name: loan_id
        referencedColumnName: id

  fields:
    loan_id:
      type: integer
    menu_id2:
      type: integer
    menu_id3:
      type: integer
    menu_id4:
      type: integer

  lifecycleCallbacks:
    prePersist: [ updateMainMenuStatus ]

これは私の LoanApp.LoanApp.orm.yml ファイルです:

LoanEv\LoanAppBundle\Entity\LoanApp\LoanApp:
  type:  entity
  repositoryClass: LoanEv\LoanAppBundle\Repository\LoanApp\LoanAppRepository
  table: loan_app
  id:
    id:
      type: integer
      generator: { strategy: auto }

## This is the INVERSE side of the relationship.
  oneToOne:
    loanapp_menu:
      targetEntity: LoanAppMenuProgress
      mappedBy: loan_app

  fields:
    bank_id:
      type: integer
  # etc.

私の LoanAppMenuProgress Entity クラスには、次のコードがあります。

namespace LoanEv\LoanAppBundle\Entity\LoanApp;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Util\Debug;

/**
 * LoanEv\LoanAppBundle\Entity\LoanApp\LoanAppMenuProgress
 */
class LoanAppMenuProgress
{
    private $id;

    private $loan_id;

    /**
     * @var LoanEv\LoanAppBundle\Entity\LoanApp\LoanApp
     */
    private $loan_app;

    private $menu_id2 = 0;

    private $menu_id3 = 0;

    private $menu_id4 = 0;

    // ...

    public function updateMainMenuStatus()
    {       
        echo("Inside prePersist's updateMainMenuStatus function. ");
    }
}

次のコードは、LoanAppController クラス内から呼び出されます。

// ...

//Save the menuStatus changes.
echo("About to persist. ");
    $em->persist($menuStatus[0]);
echo("Done persisting.");
    $em->flush();

// ...

LoanAppController でコードを実行すると、次のように画面に書き込まれます。

「持続しようとしています。持続を完了しました。」

出力が読み取られるはずの真ん中にそのビットがありません:

「永続化しようとしています。prePersist の updateMainMenuStatus 関数内。永続化を完了しました。」

変更はデータベースに書き込まれ、prePersist() を除いて、システムのすべての機能は期待どおりに動作しています。私はかなり長い間 yml の設定に苦労してきたので、私の最初の仮定は、YAML の設定が間違っているということです。

ドキュメント (私が理解できる限り) には、lifecycleCallbacks: および prePersist: アイテムを yml ファイルに追加し、永続エンティティにパブリック関数があることを確認する必要があると記載されています。明らかに、私は何かが欠けています。

誰にもアイデアはありますか?

ありがとう。

4

1 に答える 1

5

prePersist は、INSERT タイプのステートメントを実行しているときにのみ呼び出されます。このイベントは、UPDATE アクションでは発生しません。エンティティが更新されているときに何らかのアクションを実行するには、preUpdate を使用します。preUpdate には、問題のエンティティで実行できることについて、はるかに多くの制限があることに注意してください。

デリック

于 2011-10-07T15:41:37.553 に答える