【问题标题】:symfony Response with json ajaxsymfony 响应与 json ajax
【发布时间】:2023-05-01 21:49:01
【问题描述】:

我是 Symfony 的新手,我想做一些操作,这样我可以通过 Ajax 获得实体主题中所有元素的列表,但答案仍然是“未定义”这里的代码文本很强大

vue

    $(document).ready(function () {
        var $theme = $('#theme');
        $theme.append('<option value="">Choisir un thème</option>');
        $.ajax({
            type: 'post',
            url: '{{ path('web_site_liste_theme_cmb') }}',
            dataType: 'json',
            beforeSend: function () {
                $('#themediv').append('<div id="loading" style=" float: left; display: block;"><img src="{{ asset('bundles/BackBundle/img/loadingicon.gif') }}"/></div>');
            },
            success: function (json) {
                {#$('#theme').append({{  dump(json)}});#}
                console.log(json.value);
                $.each(json, function (index, value) {

                    //console.log(value);
                    $('#theme').append('<option value="' + value.id + '">' + value.name + '</option>');
                    $('#loading').remove();
                });
            }
        });
    });

控制器

  public function ListeThemeAction(Request $request)
{

    $em = $this->getDoctrine()->getEntityManager();
    if ($request->isXmlHttpRequest()) {
        $themes = $em->getRepository('WebSiteBackBundle:theme');
        $themes = $themes->findAll();
        //var_dump($themes);

        return  new JsonResponse($json);
    }
    return new JsonResponse('no results found', Response::HTTP_NOT_FOUND); // constant for 404

}

服务器响应为 200 OK,一切似乎正常,我在数据库中有相同数量的数据,但我无法读取对象值

这里是: console.log(json)

【问题讨论】:

  • 你能提供一些搬家信息吗?服务器的响应是什么?什么是“未定义”? “json.value”?
  • 服务器响应为 200 OK,一切似乎正常,我在数据库中有相同数量的数据,但我没有读取对象值

标签: php ajax symfony model-view-controller


【解决方案1】:

有很多方法可以做到这一点,我向你展示其中一种。

首先,准备好要从控制器发送的数据并返回一个JsonResponse 实例和你的数据:

public function fooAction()
{
    $data = ['foo1' => 'bar1', 'foo2' => 'bar2'];

    return new JsonResponse($data); //or $this->json($data) since Symfony 3.1
}

JsonResponse 告诉浏览器发送的数据必须被解释为 JSON,否则这些数据默认被解释为纯文本。

第二,使用相同的数据结构从Javascript回调函数中访问:

$.post('{{ path('web_site_liste_theme_cmb') }}', function (data) {
    console.log(data['foo1']); //output bar1
    console.log(data.foo2);    //output bar2 
});

在您的问题中,您发送的数据是对象数组,因此您需要循环访问此变量“json”(数组)并访问对象的每个属性。

【讨论】:

  • 如何循环到对象的每个属性。我想我已经在 "$.each(json, function (index, value) { ..." 中做到了,对吗?
  • 是的,但它取决于您的WebSiteBackBundle:Theme 实体,如果它包含“id”和“value”属性。否则,您应该在控制器中发送 json 响应之前准备这些数据。
【解决方案2】:

好吧,我找到了答案,我必须更改控制器才能实现。 谢谢尤内尔! 这是一个帮助我的链接Json in controller

控制器

public function ListeThemeAction(Request $request)
{
$output=array();
    $em = $this->getDoctrine()->getEntityManager();
    if ($request->isXmlHttpRequest()) {
        $themes = $em->getRepository('WebSiteBackBundle:theme');
        $themes = $themes->findAll();
        foreach ($themes as $theme){

            $output[]=array($theme->getId(),$theme->getName());
        }
     /*   var_dump($themes);
        $json = json_encode($themes);

        $response = new Response();*/
        //            return $response->setContent($json);
        return new JsonResponse($output);

    }
    return new JsonResponse('no results found', Response::HTTP_NOT_FOUND);
}

Vue

        $(document).ready(function () {
        var $theme = $('#theme');
        $theme.append('<option value="">Choisir un thème</option>');
        $.ajax({
            type: 'post',
            url: '{{ path('web_site_liste_theme_cmb') }}',
            dataType: 'json',
            beforeSend: function () {
                $('#themediv').append('<div id="loading" style=" float: left; display: block;"><img src="{{ asset('bundles/BackBundle/img/loadingicon.gif') }}"/></div>');
            },
            success: function (json) {

                console.log(json);
                $.each(json, function (index, value) {

                    //console.log(value);
                    $('#theme').append('<option value="' + value[0]+ '">' + value[1] + '</option>');
                    $('#loading').remove();
                });
            }
        });
    });

希望对某人有所帮助。谢谢大家的回答,对我帮助很大

【讨论】: