我正在使用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)
}
},
});
}
});
答案 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
...