Symfony2 fos_rest_bundle 参数转换器不调用实体构造函数
Symfony2 fos_rest_bundle param converter not calling entity constructor
我正在开发 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 对象没有设置默认值,这是为什么?如何让转换器调用构造函数并设置所有默认值?
我运行陷入了同样的问题。如果您确定不会从请求正文中覆盖默认值,您可以显式调用构造函数。
$application->__construct();
在我的例子中,我只想初始化所有 ArrayCollection
属性以防止在尝试访问它们时出错,所以我不关心覆盖请求中的标量值。
我还在
中发现
vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
buildFactory 方法是问题的根源。如果你改变:
return $reflectionClass->newInstanceWithoutConstructor();
到
return $reflectionClass->newInstance();
参数转换器将return一个构造函数被调用的对象。但是,如果构造函数有必需的参数,这将失败。当然你可以 fork doctrine 并改变它,但这可能有点矫枉过正 :-)
我认为通过将 JMS 的默认对象构造函数切换为 Doctrine,应该调用一个 hte 实体的构造函数:
services:
jms_serializer.object_constructor:
alias: jms_serializer.doctrine_object_constructor
public: false
我正在开发 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 对象没有设置默认值,这是为什么?如何让转换器调用构造函数并设置所有默认值?
我运行陷入了同样的问题。如果您确定不会从请求正文中覆盖默认值,您可以显式调用构造函数。
$application->__construct();
在我的例子中,我只想初始化所有 ArrayCollection
属性以防止在尝试访问它们时出错,所以我不关心覆盖请求中的标量值。
我还在
中发现vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
buildFactory 方法是问题的根源。如果你改变:
return $reflectionClass->newInstanceWithoutConstructor();
到
return $reflectionClass->newInstance();
参数转换器将return一个构造函数被调用的对象。但是,如果构造函数有必需的参数,这将失败。当然你可以 fork doctrine 并改变它,但这可能有点矫枉过正 :-)
我认为通过将 JMS 的默认对象构造函数切换为 Doctrine,应该调用一个 hte 实体的构造函数:
services:
jms_serializer.object_constructor:
alias: jms_serializer.doctrine_object_constructor
public: false