我正在尝试使用Composer ClassLoader。 我正在尝试使用PSR命名空间加载一些CodeIgniter库。
在我的index.php中,我有:
$loader = include_once ROOTPATH . 'vendor/autoload.php';
$loader->add('CLI', ROOTPATH . 'application/libraries/CLI/');
$loader->register();
我的文件夹结构的简化示例是:
libaries/
CLI/
Tree/
Parser.php - namespace CLI\Tree;
Settings.php - namespace CLI;
我是否认为 Parser.php 和 Settings.php 会自动加载?据我了解documentation example,它会查看子文件夹。
我想避免必须执行以下操作:
$loader->addClassMap([
'CLI\\Settings' => ROOTPATH . 'application/libraries/CLI/Settings.php',
'CLI\\Tree\\Parser' => ROOTPATH . 'application/libraries/CLI/Tree/Parser.php',
]);
$loader->register();
答案 0 :(得分:4)
为什么不简单地将自己的代码自动加载到您已有的composer.json
文件中?这样,Composer也会为你自己的类创建自动加载文件,你可以将你当前的项目包含在另一个项目中,而不必担心自动加载(可能不太可能,但是:),并且你学会了如何声明自动加载想要创建自己的模块。
从您的代码中我猜这可行:
"autoload": {
"psr-0": {
"CLI": "application/libraries"
}
}
说明:CLI
是路径中可能找到的类的前缀。如果您使用了很多CLI类,请尽可能长时间使用,并且只在该路径中找到一些。否则,Composer将在多个目录中搜索一个类,这对性能有害。
application/libraries
是PSR-0样式类所在的前缀路径。 PSR-0规定名为X_Y_Z
或X\Y\Z
的类位于路径X/Y/Z.php
中,因此您给出的类前缀不包含在您告诉Composer搜索的前缀路径中
前缀路径相对于composer.json
的位置。
您也可以使用PSR-4。这将允许删除空目录结构,但仅适用于名称空间:
"autoload": {
"psr-4": {
"CLI\\": "application/libraries/CLI"
}
}
两个重要的区别:类前缀必须以反斜杠结尾(因为这是JSON,反斜杠必须被转义,所以双反斜杠。)
第二:类前缀将从从类名创建的路径中删除。因此,具有类前缀W\X\Y\Z
的类W\X\
将仅创建Y\Z.php
作为类的路径并向其添加路径前缀。
我添加了" CLI"在你的路径上显示PSR-4可以工作,但是PSR-4并不真正需要该目录 - 如果它是空的,你可以将文件移动一级。