如何在TYPO3扩展中实现自定义Request Attributes
在TYPO3扩展中添加自定义Request Attributes(TYPO3 12+)
TYPO3 12及更高版本通过ServerRequest对象的attributes存储内部上下文信息,官方文档未明确说明扩展自定义属性的方法,以下是两种实用实现方式:
方式一:通过中间件全局添加(推荐)
适合需要在全局请求生命周期中注入自定义属性的场景,比如全局上下文信息、用户自定义标识等。
- 创建自定义中间件类
在你的扩展目录下新建Classes/Middleware/CustomRequestAttributeMiddleware.php:
namespace Vendor\YourExtension\Middleware; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; class CustomRequestAttributeMiddleware implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { // 添加自定义属性,支持任意类型数据 $request = $request->withAttribute('custom_extension_context', [ 'module' => 'your_extension', 'custom_flag' => true, 'user_info' => ['id' => 1, 'name' => 'test'] ]); // 传递更新后的请求继续处理 return $handler->handle($request); } }
- 注册中间件
在扩展目录下新建Configuration/RequestMiddlewares.php,配置中间件执行顺序:
return [ 'frontend' => [ 'vendor/yourextension/custom-attribute' => [ 'target' => \Vendor\YourExtension\Middleware\CustomRequestAttributeMiddleware::class, // 根据需求调整执行顺序,示例为站点初始化后、TSFE渲染前执行 'after' => ['typo3/cms-frontend/site'], 'before' => ['typo3/cms-frontend/prepare-tsfe-rendering'], ], ], // 如需在后端添加,可配置backend节点 'backend' => [ 'vendor/yourextension/custom-attribute' => [ 'target' => \Vendor\YourExtension\Middleware\CustomRequestAttributeMiddleware::class, 'after' => ['typo3/cms-backend/authentication'], ], ], ];
方式二:在控制器动作中局部添加
仅需在特定控制器动作中注入属性时使用:
namespace Vendor\YourExtension\Controller; use Psr\Http\Message\ResponseInterface; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; class ExampleController extends ActionController { public function detailAction(): ResponseInterface { // 获取底层ServerRequest对象 $serverRequest = $this->request->getAttribute('serverRequest'); // 添加自定义属性 $updatedServerRequest = $serverRequest->withAttribute('custom_action_data', 'your_custom_value'); // 将更新后的请求重新绑定到Extbase请求 $this->request = $this->request->withAttribute('serverRequest', $updatedServerRequest); // 后续业务逻辑 return $this->htmlResponse(); } }
获取自定义属性
无论通过哪种方式添加,都可以在请求生命周期的任意阶段获取属性:
- 在中间件/控制器中:
// 获取属性,第二个参数为默认值(属性不存在时返回) $customContext = $request->getAttribute('custom_extension_context', []); $customActionData = $request->getAttribute('custom_action_data', 'default_value');
- 在Fluid视图中:
先在控制器将属性传递给视图:
$this->view->assign('customContext', $request->getAttribute('custom_extension_context'));
然后在模板中使用:
<p>自定义模块标识:{customContext.module}</p>
注意:
ServerRequest的$attributes是受保护属性,必须通过withAttribute方法生成新的请求对象,不能直接修改原数组。
内容的提问来源于stack exchange,提问作者Franz Holzinger
相关产品推荐
相关产品推荐

