在 CLI 上下文中使用 Fluid StandaloneView也称为 FluidMail

问题描述

StandaloneView名称和描述(“如果您想在没有 Extbase 扩展的情况下使用 Fluid,则应该用作视图”)表明,可以在外部的任何地方使用此视图任何 Extbase 上下文。例如。用于 CLI 任务,例如生成电子邮件 (FluidMail) 或使用视图生成 HTML 代码,然后将其转换为 PDF。

不幸的是,如果模板引用了图像或 CSS/JS 文件等资产,则上述方法均无效。

原因是,视图依赖请求对象来派生到资产的域相关路径,这在 CLI 中显然不起作用,因为不存在适当的请求对象:

TYPO3\CMS\Extbase\Mvc\Web\Request prototype object
   format => protected "html" (4 chars)
   pluginName => protected "" (0 chars)
   controllerExtensionName => protected NULL
   controllerSubpackageKey => protected NULL
   controllerObjectName => protected "" (0 chars)
   controllerName => protected "Standard" (8 chars)
   controllerActionName => protected "index" (5 chars)
   arguments => protected array(empty)
   internalArguments => protected array(empty)
   dispatched => protected FALSE
   originalRequest => protected NULL
   originalRequestMappingResults => protected NULL
   method => protected "GET" (3 chars)
   requestUri => protected "http:///var/www/html/vendor/bin/typo3cms" (40 chars)
   baseUri => protected "http:///va/typo3/" (17 chars)
   isCached => protected FALSE

视图助手将创建错误的 URI,如下所示:

// f:uri.resource(path:'Css/pdf.css',extensionName: 'myext')
<link href="typo3conf/ext/myext/Resources/Public/Css/pdf.css" rel="stylesheet" />

// f:image(src:'EXT:myext/Resources/Public/Images/logo.png')
<img src="/va/typo3conf/ext/myext/Resources/Public/Images/logo.png" />

here 中给出的解决方案无济于事,因为已呈现/找到模板文件,但缺少链接的资产,这完全弄乱了模板。

此问题的可能解决方案是什么?或者:如何以正确的方式使用 StandaloneView?因为即使是核心 FluidMail 也有这个问题,所以这似乎是一个普遍的概念问题。

感谢任何输入、想法或解决方案!

附注: 将任何资源嵌入模板都不是解决方案!

解决方法

对于有同样问题并正在寻找解决方案的人,我将总结我已经想到的以及朱利安确认的内容(谢谢)。如果有人提出更好的解决方案,欢迎随时分享。

解决方案 1:避免在模板中链接资产,这些模板应该在 CLI 上下文中使用,并将所有需要的资源嵌入模板中。

解决方案 2: 使用域伪造 ServerRequest,以允许 ViewHelper 确定喜欢的资产的正确路径。

方案三:使用base-url扩展的BaseUrl辅助函数

解决方案 4: 编写自定义 ViewHelpers(或更好地扩展通用的),它不仅从请求对象确定资产的路径,而且如果作为 CLI 运行,则从 TYPO3 实例路径确定资产的路径,这应该足以进行内部处理。

尽管如此,名称 StandaloneView 仍然具有误导性,IMO 会考虑使用它的所有意外问题,例如在 CLI 上下文中。