无法使用AJAX + Symfony 4传递参数

时间:2019-08-01 20:36:15

标签: php jquery ajax symfony symfony4

我正在使用AJAX在输入 #descricao 中使用autocomplete()向数据库请求客户端名称。它请求我在Symfony 4(/ acao)中创建的路由。 问题是我试图设置一个参数(/ acao?parametro = clientname ),但出现错误:

  

无法解决的参数$ parametro   “ App \ Controller \ DefaultController :: filter()”,也许您忘记了   将控制器注册为服务,或者错过使用   “ controller.service_arguments”?

我试图更改routes.yaml:

acao:
  path: /acao
  controller: App\Controller\DefaultController::filter
  methods: GET

但是没有用。

script.js:

$( "#descricao" ).autocomplete({
        source: function( parametro, response ) {
                $.ajax({
                    url: '/acao',
                    dataType: "json",
                    data: {
                        parametro: $('#descricao').val()
                    },
                    success: function(data) {
                        response(data);
                    }
                });
        }
    });

DefaultController:

/**
     * @param string $parametro
     * @return JsonResponse
     * @Route("/acao", name="acao", methods="GET")
     */
    public function filter(string $parametro){

        $em = $this->getDoctrine()->getManager()->getRepository(Clients::class)
            ->createQueryBuilder('c')
            ->andWhere('c.name_fantasy ilike :parametro')
            ->setParameter('parametro','%'.$parametro.'%')
            ->getQuery()
            ->getArrayResult();

        return new JsonResponse($em);
    }

我在做什么错了?

答案:

我设法通过POST使其生效,并将表名称 c.name_fantasy 更改为 values :< / p>

控制器:

/**
     * @param Request $request
     * @return JsonResponse
     * @Route("/acao", name="acao", methods="POST")
     */
    public function filter(Request $request){
        $q = strtoupper(trim($request->request->get('parametro')));

        $em = $this->getDoctrine()->getManager()->getRepository(Clients::class)
            ->createQueryBuilder('c')->select('c.name_fantasy AS value')
            ->andWhere('c.name_fantasy like :parametro')
            ->setParameter('parametro', '%'.$q.'%')
            ->getQuery()
            ->getArrayResult();

        return new JsonResponse($em);
    }

AJAX:

$( "#descricao" ).autocomplete({
        source: function( parametro, response ) {
                $.ajax({
                    url: '/acao',
                    dataType: 'json',
                    method: 'POST',
                    data: {
                        parametro: $('#descricao').val()
                    },
                    success: function(data) {
                        if (data.length > 0) {
                            response(data);
                        }
                        else {
                            data = '';
                            response(data)
                        }
                    },

                });
        }
    });

1 个答案:

答案 0 :(得分:0)

首先,如果使用路由组件,则不需要使用route.yaml进行路由:

Symfony\Component\Routing\Annotation\Route

所以只需从routes.yaml中删除这些内容。

已编辑

/**
 * @param Request $request
 * @return JsonResponse
 * @Route("/acao", name="acao", methods="GET", options={"expose"=true})
 */
public function filter(Request $request)
{
    //you should strip and trim the parameter, like (just basic):
    $clientName = strip_tags(
        trim($request->query->get('parametro'))
    );

    // ...
}

请求为Symfony\Component\HttpFoundation\Request的地方<-您需要添加到use语句中!

如果这对您不起作用,请使用您的原始ajax(您的问题是什么),请尝试以下方式:

    // ...
    let formData = new FormData();
    formData.append("parametro", $('#descricao').val());

    $.ajax({
        url: '/acao',
        // ...
        data : formData,
        // ...

只是一个提示:

我建议使用symfony/bundles/FOSJsRoutingBundle。您可以像这样在js中链接路线:

import Routing from '../../vendor/friendsofsymfony/jsrouting-bundle/Resources/public/js/router';
import Routes from '../../public/assets/js/fos_js_routes.json';

Routing.setRoutingData(Routes);

// ...
    $.ajax({
        //acao is your route name and you route in this case:
        url: Routing.generate("acao"),

使用以下命令转储最新添加的路由:

php bin/console fos:js-routing:dump --format=json --target=public/assets/js/fos_js_routes.json

...