我正在使用Doctrine,FOSRestBundle和JMSSerializerBundle使用Symfony 2.7.2构建REST API . 我正在使用this pattern为我的Address类创建控制器 .

我的问题是使用默认的id->实体ParamConverter并将转换的实体传递给表单类型以进行更新,导致验证失败,如下所示 . 但是,如果我用旧的$ id替换它,我自己从存储库获取实体,它工作正常 .

是错误还是我错过了什么?

相关代码如下 .

所以我有一个get(HTTP GET)实体的控制器方法,它由id:

/**
 * @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),使用默认id ParamConverter,如在DetailAction中:

/**
 * @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;
}