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

Can't pass parameters using AJAX + Symfony 4

我正在使用 AJAX 在输入 #descricao 中使用 autocomplete() 从我的数据库中请求客户端名称。它请求我在 Symfony 4 (/acao) 中创建的路由。 问题是我正在尝试设置参数 (/acao?parametro=clientname) 但我收到错误消息:

Could not resolve argument $parametro of "App\Controller\DefaultController::filter()", maybe you forgot to register the controller as a service or missed tagging it with the "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);
                    }
                });
        }
    });

默认控制器:

/**
     * @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 并更改 table 名称 c.name_fantasy 使其工作到 :

控制器:

/**
     * @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)
                        }
                    },

                });
        }
    });

首先,你不需要使用routes.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'))
    );

    // ...
}

其中 Request 是 Symfony\Component\HttpFoundation\Request <-- 你需要添加到 use 语句中!

如果这对你不起作用,用你原来的ajax(你的问题是什么),试试这个方法:

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

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

小提示:

我推荐,使用symfony/bundles/FOSJsRoutingBundle。你可以 link 你在 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

...