Doctrine2 lifecycleCallbacks prePersist не запускается с конфигурацией YAML - PullRequest
1 голос
/ 05 октября 2011

Все мои настройки Doctrine2 выполняются в файлах YAML.У меня есть класс сущности с именем LoanAppMenuProgress, где я пытаюсь выполнить функцию prePersist.Эта сущность LoanAppMenuProgress имеет отношение oneToOne с другим классом с именем LoanApp.Существует связь внешнего ключа в таблице LoanAppMenuProgress, связанной с таблицей LoanApp в БД.

У меня есть этот конфиг для моего класса LoanAppMenuProgress в LoanApp.LoanAppMenuProgress.orm.yml:

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.

В моем классе Entity LoanAppMenuProgress у меня есть следующий код:

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, а затем убедитесь, что у меня есть открытая функция в существующем объекте.Очевидно, я что-то упускаю.

У кого-нибудь есть идеи?

Спасибо.

1 Ответ

5 голосов
/ 07 октября 2011

prePersist вызывается только тогда, когда вы выполняете оператор типа INSERT. Это событие никогда не сработает при действии UPDATE. Чтобы выполнить какое-либо действие, когда объект обновляется, используйте preUpdate. Обратите внимание, что preUpdate имеет гораздо больше ограничений на то, что может быть выполнено с данным объектом.

Деррик

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...