1

我正在使用 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

insertActionupdateAction的流程表单功能相同:

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;
}
4

0 回答 0