TYPO3 extbase中如何配置支持无插件前缀的可读GET参数
可以实现,目前有两种符合TYPO3开发规范的方案,都满足在ActionController::processRequest()执行前完成参数映射的要求:
方案1:使用路由增强器(官方推荐)
直接在站点的路由配置config.yaml中添加查询参数映射规则,无需修改代码:
routeEnhancers: SearchParamMapper: type: Extbase extension: Example plugin: Search routes: - routePath: '' _controller: 'Search::results' _arguments: q: 'q' requirements: q: '^[a-zA-Z0-9]+$'
配置完成后?q=foo和?tx_example_search[q]=foo两种传参方式可以同时生效,Extbase会自动完成参数注入。
方案2:注册PSR-15中间件(灵活度更高)
如果需要更自定义的参数处理逻辑,可以在请求到达Extbase调度器前提前把无前缀参数注入到插件参数数组中:
- 在扩展目录下新建
Configuration/RequestMiddlewares.php注册中间件:
<?php return [ 'frontend' => [ 'vendor/example/search-param-mapper' => [ 'target' => \Vendor\Example\Middleware\SearchParameterMapper::class, 'before' => [ 'typo3/cms-frontend/extbase-routing', ], ], ], ];
- 新建中间件实现类
Classes/Middleware/SearchParameterMapper.php:
<?php namespace Vendor\Example\Middleware; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; class SearchParameterMapper implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { // 处理GET参数 $queryParams = $request->getQueryParams(); if (isset($queryParams['q']) && !isset($queryParams['tx_example_search']['q'])) { $queryParams['tx_example_search']['q'] = $queryParams['q']; $request = $request->withQueryParams($queryParams); } // 如需支持POST参数,添加下方代码即可 $parsedBody = $request->getParsedBody(); if (is_array($parsedBody) && isset($parsedBody['q']) && !isset($parsedBody['tx_example_search']['q'])) { $parsedBody['tx_example_search']['q'] = $parsedBody['q']; $request = $request->withParsedBody($parsedBody); } return $handler->handle($request); } }
注意事项
- 两种方案都不需要修改原有控制器代码,
resultsAction的$q参数可以正常接收到无前缀传递的参数 - 当前场景无多插件冲突,无需额外做参数归属判断
- 若后续需要限制参数生效的页面,可以在中间件中添加页面ID判断逻辑即可
内容的提问来源于stack exchange,提问作者cweiske
相关产品推荐
相关产品推荐

