создать новую сущность, основанную на создании другой (postPersist) Doctrine2 - PullRequest
3 голосов
/ 22 декабря 2011

Я пытаюсь создать новую сущность, основанную на создании другой. Пример: у меня есть отношения

Sale <-- 1:M --> Payment

Теперь, когда я сохраняю Sale, вы должны создать начальную Payment, но я не знаю точно, как это сделать.

я попробовал:

  1. использование @ORM\HasLifecycleCallbacks(), @ORM\prePersist или @ORM\postPersist, но эти методы не получают аргументов, и я не могу сохранить сущность Payment. Я даже пытался связать Sale с Payment (в методе prePersist $payment->setSale($this)), надеясь, что EntityManager сохранит для меня Payment. информация отсюда
  2. Я пытался создать слушателя ( руководствуясь отсюда ), но он просто не работает, слушатель ни разу не запускает
  3. Сделайте это в моем SaleController::createAction(), этот способ, очевидно, прост и работает, но в этом нет ничего изящного, и это также идет вразрез с хорошим дизайном моего приложения, эта операция является частью бизнес-логики и повторяется в различных частях

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

На мой взгляд, из трех перечисленных вами 3 решений наименее неправильных. Это просто, не слишком сложно, и позже легко провести рефакторинг.

Но если вы ищете чистое решение, я думаю, что вам нужен обработчик форм или похожий сервис. Взгляните на FOSUserBundle one .

По сути, вы создадите класс PaymentManager и после обработки всех элементов формы Sales передаете всю собранную информацию в PaymentManager и позволяете ему обрабатывать всю логику создания / сохранения сущности Payment.

1 голос
/ 22 декабря 2011

Я бы предположил, что PaymentManager, как предлагает @Inori, - лучший путь, это СУХОЙ, а также центральная точка, где создаются сущности. Это позволяет вам упорядочить весь пользовательский ввод в контроллере и затем передать его менеджеру, чтобы правильно построить объект Sale.

Если вы действительно хотите воспользоваться опцией 1st и использовать обратный вызов жизненного цикла, я предполагаю, что вы получаете исключение, в котором говорится, что неуправляемая сущность была обнаружена в другой сущности - или что-то в этом роде. Чтобы обойти это, вы можете использовать каскадное сохранение на вашем отображении, что означает, что вам не нужно звонить persist для Payment:

/**
 * One-to-Many via Join Table (aka One-To-Many Unidirectional).
 * @ORM\ManyToMany(targetEntity="Payment", cascade={"persist"})
 * @ORM\JoinTable(
 *      inverseJoinColumns={
 *          @ORM\JoinColumn(unique=true, onDelete="CASCADE")
 *      }
 * )
 */

Вы можете узнать больше о One-To-One, однонаправленном , если вас это смущает.

Также вам следует прочитать о каскадном сохранении Переходное сохранение / каскадные операции .

...