Composer - 在新包中设置自动加载
Composer - Setup autoload in new package
我正在尝试制作一个作曲家包,但我正在努力设置自动加载以在我正在开发它的项目中工作。
我有两个项目:
- Project Foo(我正在开发包的地方)。
- 项目栏(我安装包的位置:
composer require myhandle/mypackage
)。
在 Foo 项目中,我(显然)也必须能够使用该包。但是在我自己的包中设置自动加载不起作用。
但是...当我提交对 Github 的更改时,在 Packagist 更新包并在 Project Bar 中更新 运行 composer update
,然后它起作用了(?!)。
而且很奇怪...如果我从 Project Foo(无法正常工作的项目)中执行 composer update
。因此,将包更新到它的当前版本 (?),使其开始工作。
所以它一定与我设置自动加载的方式有关。
注:
我通过在 vendor 目录中创建一个新的(空)文件夹来启动包,然后在那里构建包。我认为它很聪明,因为它会反映出我 composer required
包裹的样子。
我不知道这是否是不好的做法,因为 Composer 不再 'are in control' 供应商目录中的所有文件。
关于如何制作 composer 包的指南有很多,但没有一个指南解释了在开发包的项目中构建文件的好方法。
这是我对 'get the error'(在 Project Foo 中)所做的:
- 创建新的class文件,例如:
myhandle/mypackage/src/Test.php
- 然后我像这样实例化它:
$test = new MyNamespace\MyPackageName\Test();
然后我得到错误:
Fatal error: Uncaught Error: Class 'MyNamespace\MyPackageName\Test' not found
这就是 Project Bar 中的工作原理(完全相同的代码)。
我找不到有关如何在我正在开发的包中正确设置 自动加载的指南。我正在使用我在另一个作曲家项目中找到的这个自动加载文件。我把它放在我的项目的根目录中。它看起来像这样:
<?php
namespace MyNamespace\MyPackageName;
spl_autoload_register(function($cls) {
$cls = ltrim($cls, '\');
if (strpos($cls, __NAMESPACE__) !== 0) {
return;
}
$classWithoutBaseNamespace = str_replace(__NAMESPACE__, '', $cls);
// Load files from 'src' directory based on their class name without
// the StoutLogic\AcfBuilder namespace.
$path = dirname(__FILE__).
DIRECTORY_SEPARATOR.
'src'.
str_replace('\', DIRECTORY_SEPARATOR, $classWithoutBaseNamespace).
'.php';
require_once($path);
});
我在 Composer 文档中找不到它,如何在新的 project/package 中设置它。但是我可以找到大量关于如何使用自动加载的指南。
正如 and Daniel Protopopov指出的:
在 getcomposer.org regarding autoloading
查看文档
删除您的自定义自动加载器定义,在 composer.json 中注册您的命名空间(希望您已经遵循 PSR-4),运行 composer dump-autoload
.
最后但同样重要的是,无论何时何地需要使用它,只需包含
require __DIR__ . '/vendor/autoload.php';
我正在尝试制作一个作曲家包,但我正在努力设置自动加载以在我正在开发它的项目中工作。
我有两个项目:
- Project Foo(我正在开发包的地方)。
- 项目栏(我安装包的位置:
composer require myhandle/mypackage
)。
在 Foo 项目中,我(显然)也必须能够使用该包。但是在我自己的包中设置自动加载不起作用。
但是...当我提交对 Github 的更改时,在 Packagist 更新包并在 Project Bar 中更新 运行 composer update
,然后它起作用了(?!)。
而且很奇怪...如果我从 Project Foo(无法正常工作的项目)中执行 composer update
。因此,将包更新到它的当前版本 (?),使其开始工作。
所以它一定与我设置自动加载的方式有关。
注:
我通过在 vendor 目录中创建一个新的(空)文件夹来启动包,然后在那里构建包。我认为它很聪明,因为它会反映出我 composer required
包裹的样子。
我不知道这是否是不好的做法,因为 Composer 不再 'are in control' 供应商目录中的所有文件。
关于如何制作 composer 包的指南有很多,但没有一个指南解释了在开发包的项目中构建文件的好方法。
这是我对 'get the error'(在 Project Foo 中)所做的:
- 创建新的class文件,例如:
myhandle/mypackage/src/Test.php
- 然后我像这样实例化它:
$test = new MyNamespace\MyPackageName\Test();
然后我得到错误:
Fatal error: Uncaught Error: Class 'MyNamespace\MyPackageName\Test' not found
这就是 Project Bar 中的工作原理(完全相同的代码)。
我找不到有关如何在我正在开发的包中正确设置 自动加载的指南。我正在使用我在另一个作曲家项目中找到的这个自动加载文件。我把它放在我的项目的根目录中。它看起来像这样:
<?php
namespace MyNamespace\MyPackageName;
spl_autoload_register(function($cls) {
$cls = ltrim($cls, '\');
if (strpos($cls, __NAMESPACE__) !== 0) {
return;
}
$classWithoutBaseNamespace = str_replace(__NAMESPACE__, '', $cls);
// Load files from 'src' directory based on their class name without
// the StoutLogic\AcfBuilder namespace.
$path = dirname(__FILE__).
DIRECTORY_SEPARATOR.
'src'.
str_replace('\', DIRECTORY_SEPARATOR, $classWithoutBaseNamespace).
'.php';
require_once($path);
});
我在 Composer 文档中找不到它,如何在新的 project/package 中设置它。但是我可以找到大量关于如何使用自动加载的指南。
正如
在 getcomposer.org regarding autoloading
查看文档删除您的自定义自动加载器定义,在 composer.json 中注册您的命名空间(希望您已经遵循 PSR-4),运行 composer dump-autoload
.
最后但同样重要的是,无论何时何地需要使用它,只需包含
require __DIR__ . '/vendor/autoload.php';