Я загрузил ваш проект , чтобы отладить его, и я обнаружил ошибку - это было трудно обнаружить :) Я начал думать, что с Symfony 4 может быть что-то не так, но это не так. Все отлично и все отлично работает.
Посмотрите:
spl_object_hash - вернуть хеш-идентификатор для данного объекта
Эта функция возвращает уникальный идентификатор для объекта. Этот идентификатор может использоваться в качестве хэш-ключа для хранения объектов или для идентификации объекта, если объект не уничтожен. Как только объект уничтожен, его хэш может быть повторно использован для других объектов.
$beforeHash
и $afterHash
имеют разные значения - следовательно, это не один и тот же объект
В DataSetType.php
(строка 138) вы создаете новый экземпляр DataSet
, теряя ссылку на предыдущий объект, переданный в качестве второго параметра в mapFormsToData
:
Вы должны изменить объект в параметре $data
вместо создания нового экземпляра DataSet
.
Шаг 1:
Изменить этот код:
$data = (new DataSet())
->setPeriodStart($start)
->setPeriodEnd($end)
->setType($forms['Type']->getNormData())
->setUpload($forms['upload']->getNormData())
->setActive($forms['active']->getNormData())
;
К этому коду:
$data->setPeriodStart($start)
->setPeriodEnd($end)
->setType($forms['Type']->getNormData())
->setUpload($forms['upload']->getNormData())
->setActive($forms['active']->getNormData());
Шаг 2:
Удалите ненужный код с вашего контроллера. create
метод должен выглядеть следующим образом:
public function create(RequestStack $request)
{
$dataset = new DataSet();
$form = $this->createForm(DataSetType::class, $dataset);
$form->handleRequest($request->getCurrentRequest());
if ($form->isSubmitted() && $form->isValid()){
$em = $this->getDoctrine()->getManager();
$em->persist($dataset);
$em->flush();
if ($dataset->getUpload()) {
$em->getRepository('App:DataSet')
->disableUploadOthers($dataset->getId(), $dataset->getType());
}
$this->addFlash('success', 'Dataset created.');
return $this->redirectToRoute('dataset_index');
}
return $this->render('dataset/create.html.twig', [
'form' => $form->createView()
]);
}
Значения в $dataset
должны измениться без вашей помощи:)
Документация может немного сбивать с толку, но обратите внимание, что пример из документации основан на неизменяемом объекте
Кстати - было бы хорошо расширить документацию и показать, как DataMapper работает с моделями Doctrine ...