Doctrine2 lifecycleCallbacks prePersist не запускается без конфигурации YAML

#doctrine-orm #symfony #persist

#doctrine-orm #symfony #сохраняется

Вопрос:

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

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

 LoanEvLoanAppBundleEntityLoanAppLoanAppMenuProgress:
  type:  entity
  repositoryClass: LoanEvLoanAppBundleRepositoryLoanAppLoanAppMenuProgress
  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:

 LoanEvLoanAppBundleEntityLoanAppLoanApp:
  type:  entity
  repositoryClass: LoanEvLoanAppBundleRepositoryLoanAppLoanAppRepository
  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 у меня есть следующий код:

 namespace LoanEvLoanAppBundleEntityLoanApp;

use DoctrineORMMapping as ORM;
use DoctrineCommonUtilDebug;

/**
 * LoanEvLoanAppBundleEntityLoanAppLoanAppMenuProgress
 */
class LoanAppMenuProgress
{
    private $id;

    private $loan_id;

    /**
     * @var LoanEvLoanAppBundleEntityLoanAppLoanApp
     */
    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, на мой экран выводится следующее:

«Собирается сохраниться. Выполнено сохранение «.

Мне не хватает этого бита в середине, где вывод должен гласить:

«Собирается сохраниться. Внутри функции updateMainMenuStatus prePersist. Выполнено сохранение «.

Изменения записываются в базу данных, и вся функциональность системы работает должным образом, за исключением prePersist() . Я довольно долго боролся с настройками yml, поэтому мое первоначальное предположение заключается в том, что моя настройка YAML неверна.

В документации (насколько я мог понять) упоминается, что я должен добавить элементы lifecycleCallbacks: и prePersist: в файл yml, а затем убедиться, что у меня есть общедоступная функция в сохраняющемся объекте. Очевидно, я что-то упускаю.

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

Спасибо.

Ответ №1:

prePersist вызывается только при выполнении инструкции INSERT type. Это событие никогда не сработает при действии ОБНОВЛЕНИЯ. Чтобы выполнить какое-либо действие при обновлении объекта, используйте preUpdate . Обратите внимание, что preUpdate имеет гораздо больше ограничений на то, что может быть выполнено с рассматриваемой сущностью.

Вышка