Ответ основан на (и может еще измениться) на основе обсуждения в комментариях с ОП под вопросом.
Простой вариант использования: самоссылающаяся Doctrine Entity неправильно обновляет свойства объекта Entity, связанные с родителями / потомками, при сохранении.
ОП предоставлена сущность.
Я предполагаю, что у вас есть настройка формы для этого объекта. Я также предполагаю, что это правильно настроено, поскольку вы не предоставили его после того, как его спросили (потому что, по правде говоря, это означало бы много кода). Тем не менее, допущение, что материал с кодом делает для многих ошибок, поэтому я упоминаю об этом здесь.
Таким образом, я предполагаю, что обработка вашей Формы в Контроллере может быть ошибочной. Для проверки воспользуйтесь следующей упрощенной функцией addAction
и сделайте снимок (заводской код ниже).
/**
* @var RentalForm
*/
protected $form;
/**
* @var ObjectManager
*/
protected $objectManager;
public function __construct(ObjectManager $objectManager, RentalForm $form)
{
$this->form = $form;
$this->objectManager = $objectManager;
}
public function addAction()
{
/** @var RentalForm $form */
$form = $this->getForm();
/** @var Request $request */
$request = $this->getRequest();
if ($request->isPost()) {
$form->setData($request->getPost());
if ($form->isValid()) {
$entity = $form->getObject();
$this->getObjectManager()->persist($entity);
try {
$this->getObjectManager()->flush();
} catch (\Exception $e) {
$message = sprintf(
'Was unable to save the data. Saving threw an error. <br />Code: %s. <br />Message: %s',
$e->getCode(),
$e->getMessage()
);
$this->flashMessenger()->addErrorMessage($message);
return [
'form' => $form,
'validationMessages' => $form->getMessages() ?: '',
];
}
$this->flashMessenger()->addSuccessMessage(
$this->getTranslator()->translate('Successfully created object.')
);
// TODO replace vars with your own: return $this->redirect()->route($route, $routeParams);
}
$this->flashMessenger()->addWarningMessage(
'Your form contains errors. Please correct them and try again.'
);
}
return [
'form' => $form,
'validationMessages' => $form->getMessages() ?: '',
];
}
Фабрика для класса с вышеперечисленным, измените, как вам нужно для ситуации
class RentalControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
/** @var ObjectManager $objectManager */
$objectManager = $container->get(EntityManager::class);
/** @var FormElementManagerV3Polyfill $formElementManager */
$formElementManager = $container->get('FormElementManager');
/** @var RentalForm $form */
$form = $formElementManager->get(RentalForm::class);
return new RentalController($objectManager, $form);
}
}