Php Symfony2 FOSRestBundle PUT操作表单返回空结果

Php Symfony2 FOSRestBundle PUT操作表单返回空结果,php,symfony,symfony-forms,fosrestbundle,Php,Symfony,Symfony Forms,Fosrestbundle,我使用的是Symfony 2.2和最新版本的FOSRestBundle。因此,我已设法使大多数操作正常工作,但我似乎与FormBuilder有一个问题,即我正在传递我的PUT调用请求 我已经检查了请求对象,它来自我的Backbone.je模型,它应该是(.save()),但是在绑定到表单之后,实体返回时只带有id,这会导致flush()抛出错误,因为必填字段没有填充 控制器中的操作: header('Access-Control-Allow-Methods: GET, POST, PUT, DE

我使用的是Symfony 2.2和最新版本的FOSRestBundle。因此,我已设法使大多数操作正常工作,但我似乎与FormBuilder有一个问题,即我正在传递我的PUT调用请求

我已经检查了请求对象,它来自我的Backbone.je模型,它应该是(.save()),但是在绑定到表单之后,实体返回时只带有id,这会导致flush()抛出错误,因为必填字段没有填充

控制器中的操作:
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS ');
header('Allow GET, POST, PUT, DELETE, OPTIONS ');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type, *');

use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Routing\ClassResourceInterface;
use FOS\Rest\Util\Codes;
use Symfony\Component\HttpFoundation\Request;
use Greenthumbed\ApiBundle\Entity\Container;
use Greenthumbed\ApiBundle\Form\ContainerType;

class ContainerController extends FOSRestController implements ClassResourceInterface
{
/**
 * Put action
 * @var Request $request
 * @var integer $id Id of the entity
 * @return View|array
 */
public function putAction(Request $request, $id)
{
    $entity = $this->getEntity($id);
    $form = $this->createForm(new ContainerType(), $entity);
    $form->bind($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

        return $this->view(null, Codes::HTTP_NO_CONTENT);
    }

    return array(
        'form' => $form,
    );
}

/**
 * Get entity instance
 * @var integer $id Id of the entity
 * @return Container
 */
protected function getEntity($id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('GreenthumbedApiBundle:Container')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Container entity');
    }

    return $entity;
}
这种形式称为:

到目前为止,我已经尝试了所有的方法,但是我对Symfony还相当陌生,我无法理解为什么$entity不包含请求接收到的值

仅供参考:我已经尝试过手动操作,比如用请求的ID实例化一个容器类,并使用setter向其中输入值,它工作得很好,我只想按照Symfony建议的正确方式来做

事先非常感谢

使用将实体作为参数自动注入方法中

use Greenthumbed\ApiBundle\Entity\Container;

// ...

public function putAction(Request $request, Container $container)
{
    $form = $this->createForm(new ContainerType(), $container);
    $form->bind($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();

        // Entity already exists -> no need to persist!
        // $em->persist($entity);   

        $em->flush();

        return $this->view(null, Codes::HTTP_NO_CONTENT);
    }

    return array('form' => $form);
}

尝试更改putAction中的以下行:

$form = $this->createForm(new ContainerType(), $entity);
致:

不幸的是,生活并不是这么简单,因为大多数浏览器都这么做 不支持发送PUT和DELETE请求。幸运的是Symfony2 为您提供了解决此限制的简单方法。通过 在查询字符串中包含_方法参数或 HTTP请求,Symfony2将在匹配时使用此方法 路线。表单自动包含此参数的隐藏字段 如果他们的提交方法不是GET或POST。见相关章节 有关详细信息,请参阅表单文档

如果表单的方法不是GET或POST,而是PUT、PATCH或DELETE, Symfony2将插入一个名为“\u method”的隐藏字段 存储此方法。表格将以普通邮寄方式提交 请求,但Symfony2的路由器能够检测到“\u方法” 参数,并将请求解释为PUT、PATCH或DELETE 要求阅读烹饪书“如何使用GET以外的HTTP方法”一章 并在“路线”中发布,以了解更多信息


我认为您遇到的问题与我遇到的问题相同: 错误在于表单的名称

在表单定义中,名称为“greenthumbed_apibundle_containertype”。 公共函数getName() { 返回“greenthumbed_apibundle_containertype”; }

因此,要将请求绑定到此表单,json应该如下所示:

{"greenthumbed_apibundle_containertype": [{"key": "value"}]}
因为Backbone.save()方法提供了这种json

{"key":"value","key2":"value2"}
您必须从表单中删除该名称:

public function getName()
{
    return '';
}
通常,如果您想发布一个带有占位符的json,比如

"something":{"key":"value"}
您的表单名称必须完全是“某物”


根据我自己的问题

为什么在put操作中使用表单类型?服务器端验证只需要一个验证器。客户端应用程序应该处理表单内容。但是,请执行var_dump($request)或使用调试工具栏查看是否实际发送了值。您是否设法解决了此问题???,我遇到了相同的问题:OI无法看到这是如何解决问题的。这解释了为什么您必须将
“method”=>“put”
作为参数放在创建表单中,以模拟“put”网络浏览器中的行为……在Symfony 2.6和FosRestBundle 1.5中对我起了作用。文档中提到了什么?同一个问题,您是如何解决的?我使用的是Symfony 2.7和FosRestBundle 1.7。我的表单
如果($form->isValid()){
为FALSE,并且
$errors=$form->getErrors();
为空。将方法类型更改为“PUT”修复了该问题。+1我在Symfony 2.8.2和FOSRestBundle 1.7中遇到PUT请求问题-这为我修复了该问题。
public function getName()
{
    return '';
}
"something":{"key":"value"}