Symfony2 fos_rest_bundle конвертер параметров не вызывает конструктор сущностей

Я разрабатываю API и имею следующую сущность:

/**
* Solicitud de registro.
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="DnD\RaHApiBundle\Repository\ApplicationRepository")
*/
class Application
{

public function __construct()
{
$pending = new Event("PENDING", "APPLICATION");

$this->status = new ArrayCollection($pending);
$this->ownsVehicle = false;
$this->resident = true;
$this->timestamp = new DateTime();
}

/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Groups({"application_info"})
*/
private $id;

...

Обратите внимание на конструктор. Он устанавливает некоторые поля в моей сущности со значениями по умолчанию. Теперь действие моего контроллера:

  /**
* Crea una nueva solicitud de afiliacion
* @return array
*
* @Post("applications")
* @ParamConverter("application", converter="fos_rest.request_body")
*/
public function postAction(Application $application)
{
$this->applicationsRepo->save($application);

// It has no date, no status, no defaults!!!

$view = $this->view($application, 200);
$view->getSerializationContext()->setSerializeNull(true);
$view->getSerializationContext()->setGroups(array('application_info'));
return $this->viewHandler->handle($view);
}

Для объекта $ application не установлены значения по умолчанию, почему это так? Как я могу заставить конвертер вызвать конструктор и установить все значения по умолчанию?

0

Решение

Я столкнулся с той же проблемой. Если вы уверены, что значения по умолчанию не будут перезаписаны из тела запроса, вы можете явно вызвать конструктор.

$application->__construct();

В моем случае я просто хотел инициализировать все ArrayCollection свойства для предотвращения ошибок, пытающихся получить к ним доступ, поэтому мне не нужно перезаписывать скалярные значения из запроса.

Я также обнаружил, что в

vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php

метод buildFactory является источником проблемы. Если вы измените:

return $reflectionClass->newInstanceWithoutConstructor();

в

return $reflectionClass->newInstance();

преобразователь параметров вернет объект, конструктор которого был вызван. Однако это не удастся, если конструктор имеет требуемые аргументы. Конечно, вы могли бы развить доктрину и изменить это, но это может быть излишним 🙂

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector