问题描述: 我将 TYPO3 项目升级到版本 12,但收到以下错误
Cannot autowire service "TYPO3\CMS\Core\Routing\PageArguments": argument "$pageId" of method "__construct()" is type-hinted "int", you should configure its value explicitly.
由于相关类是TYPO3核心类,我不知道是什么导致了这个错误。
我尝试过的: 该错误是由于安装了特定扩展而发生的。 我已经使用安装工具中的扩展扫描程序来查找并更新此扩展中已弃用的代码。
目前我正在测试网站的前端以查找并修复错误,然后我遇到了这个问题。
我期望发生什么: 网站加载时没有出现上述错误。
我将非常感谢任何有关可能导致此问题的原因的提示。
谢谢
更新
您可以在here阅读,TyposcriptFrontendController 不再作为可注入的服务提供。因此,您可以通过查找需要此类型作为构造函数参数或注入器方法参数的类来识别项目中的问题。
构造函数注入的 ripgrep 示例
rg '__construct\(.*TyposcriptFrontendController'
这可以找到你的问题,但表达式不够好,无法考虑构造函数参数列表中的换行符,因此可能存在盲点。
ripgrep 注入方法示例
rg 'inject.+\(.*TyposcriptFrontendController'
这里同样的限制
我希望你能在你的代码中找到问题。
要解决该问题,您需要删除前端控制器的注入并以其他方式访问它。您可以通过 ContentObjectRenderer、ServerRequest 访问它,或者作为最后的手段通过全局变量 $GLOBALS['TSFE'] 访问它。在大多数情况下,您确实可以访问某些内容...
原答案
在我的例子中,这是一个类的“自动装配”,它期望 TyposcriptFrontendController 作为构造函数参数注入。
我最终使用了以下配置(package/Configuration/Services.yaml)
services:
_defaults:
autowire: false
autoconfigure: true
public: false
YourVendor\YourPackage\:
resource: '../Classes/*'
YourVendor\YourPackage\ProblematicClass:
# autowire: false will be inherited from _defaults
public: true
YourVendor\YourPackage\UnproblematicClass:
autowire: true
public: true
通过这种方法,您可以启用/禁用每个类的自动装配。我没有注入 TyposcriptFrontendController,而是从 ServerRequest 属性 (frontend.controller) 检索它。
从 V11 到 V12 一定有什么变化
我建议您查看本地站点包的 Services.yaml/Services.php 文件。
在这里您可以找到完整的文档:
针对 V12 已修复: