【问题标题】:Symfony2 CRUD, GET returns JSON but POST creates EMPTY records and PUT does nothingSymfony2 CRUD,GET 返回 JSON,但 POST 创建 EMPTY 记录,PUT 什么也不做
【发布时间】:2013-12-08 06:10:05
【问题描述】:

我是 Symfony2 和许多捆绑软件的新手,但我正在开发一个原型 REST API,我使用过 FOSRestBundle 并且还玩过 Symfony2 生成的本机 CRUD。但是,我发现虽然 Symfony2 CRUD 代码返回正确的 JSON 格式响应,但 POST 给我一个错误,我正在寻找有关如何解决问题的解释和教程。查看实体的 GET 和 POST 代码,在这种情况下假设为地址:

/**
 * Lists all Address entities.
 *
 * @Route("/", name="address")
 * @Method("GET")
 * @Template()
 */
public function indexAction()
{
    $em = $this->getDoctrine()->getManager();

    $entities = $em->getRepository('MyWebServicesBundle:Address')->findAll();

    return array(
        'entities' => $entities,
    );
}
/**
 * Creates a new Address entity.
 *
 * @Route("/", name="address_create")
 * @Method("POST")
 * @Template("MyWebServicesBundle:Address:new.html.twig")
 */
public function createAction(Request $request)
{
    $entity = new Address();
    $form = $this->createCreateForm($entity);
    $form->handleRequest($request);

    // Inserted new code for deserialization
    $entity->setUseruid($request->request->get("useruid"));
    $entity->setCity($request->request->get("city"));
    $entity->setLatitude($request->request->get("latitude"));
    $entity->setLongitude($request->request->get("longitude"));

    $serializer = JMS\Serializer\SerializerBuilder::create()->build();
    $entity = $serializer->deserialize($request->request->all(), 'Name\BundleName\Entity\Address', 'json');

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

        return $this->redirect($this->generateUrl('address_show', array('id' => $entity->getId())));
    }

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

假设我正在使用 AJAX 向 API 发送请求,这是我的 GET 和 POST 代码:

        $.ajax({
            dataType: "json",
            type: "GET",
            url: "/symfony/web/app_dev.php/address/",
            success: function (responseText)
            {
                alert("Request was successful, data received: " + responseText); 
            },
            error: function (error) {
                alert(JSON.stringify(error));
            }
        });

        $.ajax({
            dataType: "json",
            type: "POST",
            data: {"id":1,"useruid":"Nothing","type":"Office in Space","latitude":"74.3","longitude":"33.2","displayed":true,"public":true,"verified":true,"street":"Something","city":"Something","country":"Space","region":"North America","created":"2009-03-07T00:00:00-0500","delete_status":"active"},
            url: "/symfony/web/app_dev.php/address/",
            success: function (responseText)
            {
                console.log("Request was successful, data received: " + JSON.stringify(responseText)); 

            },
            error: function (error) {
                alert(JSON.stringify(error));
            }
        });

当 GET 返回正确时,POST 返回以下错误: {"code":500,"message":"Warning: json_encode(): recursion detected in /var/www/projects/symfony/vendor/jms/serializer /src/JMS/Serializer/JsonSerializationVisitor.php 第 29 行"}。我需要做什么来解决错误?我可以返回单个实体或所有实体,但 POST 只是将数据发送到创建实体的路径会给出错误。我已将我的 JMSSerializer 包从 0.12.* 更新为 dev-master,并检查以确保要由 AJAX 发送的数据中没有 NULL 值,但错误仍然存​​在。如何让我的 POST 控制器从 POST 中发送给它的有效 JSON 创建数据?

我也试过PUT,结果是一样的,它不更新资源,不应该只更新表中的记录吗?如果我需要提供更多信息来找出这个错误的来源,请告诉我! 代码已在上面进行了编辑。

【问题讨论】:

    标签: php ajax json symfony jmsserializerbundle


    【解决方案1】:

    $this->redirect 返回不是您想要的 RedirectResponse 对象。如果要返回重定向 url,只需返回 array('redirect_url' => $this->generate(...)),然后使用 javascript 重定向客户端。

    【讨论】:

    • 您的评论帮助我再次查看了该代码,我暂时删除了重定向以查看 POST 现在是否有效,是的,它确实有效,但还有一个问题:它无法反序列化数据并存储将其放入表中。当我调用设置器时,我可以成功地单独保存每个字段,但是当我使用 JMSSerializer 时,它会返回 500 内部错误。我已经更新了我的代码,有什么关于 JMS 无法正常工作的想法吗?
    • 异常信息是什么?
    猜你喜欢
    • 2011-02-14
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多