Sonata Admin仪表盘带参数Action报错:filter需标量类型如何解决?
Sonata Admin仪表盘配置带参数Action的问题及解决办法
问题场景
配置Sonata Admin仪表盘时,尝试添加带参数的Action,使用的配置代码如下:
groups: panel: items: - route: 'admin_app_order_list' route_params: { filter: { group: { value: 'active' } } } label: test
执行后触发如下错误:
Invalid type for path "sonata_admin.dashboard.groups.panel.items.0.route_params.filter". Expected "scalar", but got "array".
疑问
- 为何参数
filter要求为标量类型? - 是否存在可行的修复方案?
原因分析
Sonata Admin仪表盘的route_params配置项,是直接映射到HTTP请求的查询参数。而HTTP查询参数本质上都是字符串(标量类型),不支持嵌套数组的结构。框架的配置验证机制会严格校验参数类型,因此传入嵌套数组格式的filter时,就会触发类型不匹配的错误。
修复方案
方案1:使用扁平化的查询参数格式
Sonata Admin的列表过滤器支持扁平化的查询参数格式,你可以把嵌套数组转换成filter[group][value]这种键名形式,配置示例如下:
groups: panel: items: - route: 'admin_app_order_list' route_params: filter[group][value]: 'active' label: test
这种方式直接符合HTTP查询参数的格式要求,能被Sonata Admin正确解析并应用过滤器。
方案2:自定义路由与Controller方法(更灵活)
如果需要更复杂的过滤逻辑,或者不想在配置里写冗长的参数键名,可以自定义路由和对应的Controller方法:
- 添加自定义路由
在config/routes.yaml中新增路由:
admin_app_order_active_list: path: /admin/app/order/list/active controller: App\Controller\Admin\OrderAdminController::listActiveAction
- 实现Controller方法
创建或修改对应的Admin Controller,预设过滤参数:
// src/Controller/Admin/OrderAdminController.php namespace App\Controller\Admin; use Sonata\AdminBundle\Controller\CRUDController; class OrderAdminController extends CRUDController { public function listActiveAction() { // 预先设置过滤器参数,指定group为active $this->admin->setFilterParameters(['group' => ['value' => 'active']]); // 调用原生的listAction渲染列表页 return $this->listAction(); } }
- 更新仪表盘配置
在仪表盘配置中直接使用这个自定义路由:
groups: panel: items: - route: 'admin_app_order_active_list' label: test
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

