You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TYPO3扩展中实现自定义Request Attributes

在TYPO3扩展中添加自定义Request Attributes(TYPO3 12+)

TYPO3 12及更高版本通过ServerRequest对象的attributes存储内部上下文信息,官方文档未明确说明扩展自定义属性的方法,以下是两种实用实现方式:

方式一:通过中间件全局添加(推荐)

适合需要在全局请求生命周期中注入自定义属性的场景,比如全局上下文信息、用户自定义标识等。

  1. 创建自定义中间件类
    在你的扩展目录下新建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);
    }
}
  1. 注册中间件
    在扩展目录下新建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:20:13