Symfony中AJAX参数传递问题:为何length参数未生效?
问题排查与修复方案
让我帮你梳理下问题所在——你的AJAX请求传递的length没生效,始终取默认值10,主要是几个关键的代码遗漏和错误导致的,咱们一步步来修复:
1. JsonGenerator类未正确获取请求对象
你在getJson方法里用到了$request变量,但这个变量既没通过依赖注入引入,也没从外部传递进来,所以isset($request)永远是false,代码只会走默认的$length = 10分支。
修复方式:
推荐使用Symfony的RequestStack来获取当前请求(比直接注入Request更灵活,适配非HTTP场景),修改JsonGenerator的代码:
use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; class JsonGenerator { private $em; private $requestStack; public function __construct( EntityManagerInterface $em, RequestStack $requestStack, // 保留你原有的其他参数 ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyAccessorInterface $propertyAccessor = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null, callable $objectClassResolver = null, array $defaultContext = [] ){ $this->em = $em; $this->requestStack = $requestStack; // 注入RequestStack } public function getJson($fileName) { $request = $this->requestStack->getCurrentRequest(); // 获取当前请求 $length = 10; // 默认值 // 检查请求是否存在,且是否携带length参数 if ($request && $request->request->has('length')) { $length = (int)$request->request->get('length'); // 强制转为整数更安全 } $file = 'files/'.$fileName.'.json'; $input = file_get_contents($file); $array = json_decode($input); $new = []; foreach ($array as $key => $value) { if ('data' == $key) { $new = \array_slice($value, 0, $length); // 这里要使用变量$length,不是未定义的length常量 } } $array->data = $new; $output = json_encode($array); return new Response($output); } }
2. 数组切片时误用了未定义常量
你原代码里的\array_slice($value, 0, length);少了变量符号$,PHP会把length当作未定义的常量处理,默认转为字符串"length",这会导致切片逻辑完全不符合预期。
修复方式:
把length改成$length,就像上面代码里那样,确保使用的是咱们获取到的变量值。
3. AJAX请求的data参数存在语法错误
你的AJAX代码里data: { "id": id, "length": length, "start": start, },最后一个键值对后面多了个逗号,虽然部分浏览器能兼容,但严格来说这是语法错误,可能导致请求参数解析异常。
修复方式:
去掉末尾的多余逗号:
var length = 5; $.ajax({ method:'POST', data: { "id": id, "length": length, "start": start }, // 移除最后一个逗号 url:'{{ path('json', { 'fileName': output.fileName }) }}', success : function (data) { alert("success"); } })
完成以上修改后,你的AJAX请求传递的length=5就能被正确获取,返回的JSON数据中data字段的长度就会是你期望的5了。
内容的提问来源于stack exchange,提问作者fala
相关产品推荐
相关产品推荐

