自动加载本地 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.jsonfile 将被考虑在内,您需要类似

"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 扩展的类的主要内容,如果未能解决你的问题,请参考以下文章

TYPO3 v10 没有作曲家自动加载的功能测试

Fluid TYPO3:更新后出错:无法分析类:FluidTYPO3\Flux\ViewHelpers\Flexform\SheetViewHelper 可能未加载或没有自动加载器?

TYPO3 测试框架 - FunctionalTestCase 未从扩展加载 TCA 覆盖

laravel怎么自动加载Model和一些常用的类

thinkphp5 自动加载的类 怎么使用

Laravel psr-4 不自动加载