无法使用 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
...
我正在使用 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
...