自动加载本地 TYPO3 扩展的类
Posted
技术标签:
【中文标题】自动加载本地 TYPO3 扩展的类【英文标题】:Autoloading of classes of a local TYPO3 extension 【发布时间】:2021-12-26 18:48:27 【问题描述】:在我的以下composer.json
中,我需要扩展,这些扩展与整个项目位于同一个 Git 存储库中。所以我添加了repositories
部分,然后我添加了composer req vendor/site_package:@dev
以要求我的本地扩展。
现在我意识到,扩展的某些类没有自动加载。
我需要在项目的composer.json
中额外添加autoload
部分吗?
"name": "site-package",
"description": "Base composer.json",
"repositories": [
"type": "path",
"url": "./packages/*"
],
"require":
"typo3/cms-backend": "^10.4",
"typo3/cms-belog": "^10.4",
"typo3/cms-beuser": "^10.4",
"typo3/cms-core": "^10.4",
...
"vendor/site_package": "@dev",
"georgringer/news": "^8",
...
,
"autoload":
"classmap": [
"public/typo3conf/ext/site_package/Classes"
],
"psr-4":
"Vendor\\SitePackage\\": "public/typo3conf/ext/site_package/Classes"
,
"extra":
"typo3/cms":
"root-dir": "public",
"web-dir": "public"
,
"config":
"vendor-dir": "vendor",
"bin-dir": "bin"
,
"scripts":
"typo3-cms-scripts": [
"typo3cms install:generatepackagestates",
"typo3cms install:fixfolderstructure"
],
"post-autoload-dump": [
"@typo3-cms-scripts"
]
在ext:site_package
我也有以下自动加载部分:
"autoload":
"psr-4":
"Vendor\\SitePackage\\": "Classes",
,
两个都需要吗?为什么?
【问题讨论】:
【参考方案1】:你不应该混合这两个composer.json
。
由于您已经采用了拥有目录packages
(这是一件好事)的方法,因此其中的每个扩展都需要一个自己的composer.json
文件,当然也需要一个部分
"psr-4":
"Vendor\\MyExt\\": "Classes"
通过要求此包,将使用此自动加载信息。
如果您仍然在 typo3conf/ext/my_ext
中包含自定义扩展名,那么 composer.json
file 将不被考虑在内,您需要类似
"psr-4":
"Vendor\\MyExt\\": "typo3conf/ext/myext/Classes"
【讨论】:
这也是我的预期,packages
中所有必需的扩展都将从他们的composer.json
自动加载。有趣的是,大多数类都是可用的(例如自定义 ViewHelpers),但是没有找到命名空间 Vendor\MyExt\Slot
的插槽类(1245673367 TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException: The given class "Vendor\MyExt\Slot\MySlot" is not a registered object.
)。只要我在项目 composer.json 中添加 classmap
部分,就会找到该类。 psr-4
部分不需要 composer.json 项目......我做错了吗?
关于此的更多信息:项目 composer.json 的 autoload
中的 psr-4
部分也无济于事。只是classmap
解决了我的问题。
您确定该插槽遵循 psr4 指南吗?
您说的完全正确,我没有遵循 psr-4 指南。命名空间为Vendor\MyExt\Slot\MySlot
,但文件夹名为Classes/Slots/
。将命名空间更改为Vendor\MyExt\Slots\MySlot
后,它正在工作。非常感谢!【参考方案2】:
autoload
部分仅在您的站点包composer.json
中需要。不必将它也放在根文件夹的composer.json
中。
请参考documentation 您的站点包的composer.json
应该是什么样子。
如果您仍然遇到自动加载问题,请尝试composer dump-autoload
或删除扩展程序并再次要求它。并确保检查命名空间的大写/小写。它区分大小写。如果您在需要站点包后更改它,则需要删除并再次需要该包。
【讨论】:
这也是我的预期。请参阅我在 Georg Ringers 回答中的评论。 顺便说一句:转储自动加载的正确调用是composer dump-autoload
。我无法编辑您的答案,因为我会更改少于 6 个字符 ;-)
谢谢,修复了!以上是关于自动加载本地 TYPO3 扩展的类的主要内容,如果未能解决你的问题,请参考以下文章
Fluid TYPO3:更新后出错:无法分析类:FluidTYPO3\Flux\ViewHelpers\Flexform\SheetViewHelper 可能未加载或没有自动加载器?