我正在使用 Doctrine、FOSRestBundle 和 JMSSerializerBundle 使用 Symfony 2.7.2 构建 REST API。我正在使用这种模式为我的 Address 类创建控制器。
我的问题是,使用默认 id->entity ParamConverter 并将转换后的实体传递给表单类型以更新它会导致验证失败,如下所示。但是,如果我用老式的 $id 替换它并自己从存储库中获取实体,它就可以正常工作。
是错误还是我错过了什么?
相关代码如下。
所以我有一个通过 id 获取(HTTP GET)实体的控制器方法:
/**
* @Route("addresses/{id}", requirements={"id" = "\d+"}, name="base_address_entity")
* @Method({"GET"})
*/
public function detailAction(Address $address)
{
return $address;
}
(工作正常)
创建新实体的另一个操作(HTTP POST)
/**
* @Route("addresses")
* @Method({"POST"})
*/
public function insertAction(Request $request)
{
return $this->processForm(new Address(), $request);
}
(也可以正常工作)
..和一个更新操作(HTTP PUT),使用 DetailAction 中的默认 id ParamConverter:
/**
* @Route("addresses/{id}", requirements={"id" = "\d+"}, name="base_address_create")
* @Method({"PUT"})
*/
public function updateAction(Address $address, Request $request)
{
return $this->processForm($address, $request);
}
而这个失败并出现未指定的表单错误:
"code": 400,
"message": "Validation Failed",
"errors": {
"errors": [
"This value is not valid."
],
"children": {
...no errors in any of the of the other fields
insertAction和updateAction的流程表单功能相同:
public function processForm(Address $address, Request $request)
{
/** @var AddressRepository $addressRepository */
$form = $this->createForm($this->get('address.form_type'), $address);
$form->submit($request->get($form->getName()));
if ($form->isValid())
{
$addressRepository = $this->get('address.repository');
$addressRepository->save($address);
return $this->get('success');
}
return $form;
}