自动加载本地 TYPO3 扩展的 类

Autoloading of classes of a local TYPO3 extension

在我的后续 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",
    }
},

两者都需要吗?为什么?

autoload 部分仅在您的网站包 composer.json 中需要。没有必要也将它放在根文件夹的 composer.json 中。

请参阅 documentation 您的网站包 composer.json 应该是什么样子。

如果自动加载仍然存在问题,请尝试 composer dump-autoload 或删除扩展并重新要求它。并确保检查您的命名空间的 upper-/lowercase。它区分大小写。如果在需要站点包后更改它,则需要删除并再次需要该包。

你永远不应该混合这两个 composer.json

由于您已经遵循了拥有目录 packages 的方法(这是一件好事),其中的每个扩展名都需要一个自己的 composer.json 文件,当然还需要一个部分

"psr-4": {
   "Vendor\MyExt\": "Classes"
}

通过要求这个包,这个自动加载信息将被使用。


如果您仍然在 typo3conf/ext/my_ext 中使用自定义扩展名,那么 composer.json 文件将 不会 被考虑在内,您需要类似

"psr-4": {
   "Vendor\MyExt\": "typo3conf/ext/myext/Classes"
}