使用作曲家的自动加载



我一直在网上寻找,但在这个问题上没有运气。我正在composer.json中使用此代码使用作曲家的自动加载:

"autoload": {
"psr-0": {"AppName": "src/"}
}

但是我需要在比供应商文件夹更高的级别自动加载。

做这样的事情不起作用:

"autoload": {
"psr-0": {"AppName": "../src/"}
}

有谁知道修复或我该怎么做?

每个包都应该负责自动加载本身,你想用你定义的包之外的自动加载类来实现什么?

如果它适用于您的应用程序本身,一种解决方法是将命名空间添加到加载程序实例,如下所示:

<?php
$loader = require 'vendor/autoload.php';
$loader->add('AppName', __DIR__.'/../src/');

作曲家文档指出:

添加自动加载字段后,您必须重新运行安装到 重新生成供应商/自动加载.php文件。

假设您的"src"目录与"供应商"目录位于同一级别:

  • 来源
    • 应用名称
  • 供应商
  • 作曲家.json

以下配置是绝对正确的:

{
"autoload": {
"psr-0": {"AppName": "src/"}
}
}

但是您必须重新更新/安装依赖项才能使其为您工作,即运行:

php composer.phar update

此命令将获取最新版本的依赖项,并更新文件"供应商/作曲家/autoload_namespaces.php"以匹配您的配置。

此外,如@Dom所述,您可以使用composer dump-autoload来更新自动加载机,而无需进行更新。

还有其他方法可以使用作曲家自动加载功能。加载没有命名空间的包或带有自定义自动加载函数的包的方法。

例如,如果您还想包含包含自动加载函数的单个文件,则可以使用"files"指令,如下所示:

"autoload": {
"psr-0": {
"": "src/",
"SymfonyStandard": "app/"
},
"files": ["vendor/wordnik/wordnik-php/wordnik/Swagger.php"]
},

Swagger.php文件中,我们得到了:

function swagger_autoloader($className) {
$currentDir = dirname(__FILE__);
if (file_exists($currentDir . '/' . $className . '.php')) {
include $currentDir . '/' . $className . '.php';
} elseif (file_exists($currentDir . '/models/' . $className . '.php')) {
include $currentDir . '/models/' . $className . '.php';
}
}
spl_autoload_register('swagger_autoloader');

https://getcomposer.org/doc/04-schema.md#files

否则,您可能希望使用类映射引用:

{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}

https://getcomposer.org/doc/04-schema.md#classmap

注意:在测试期间,请记住启动作曲家dump-autoload命令,否则您将看不到任何更改!

./composer.phar dump-autoload

快乐自动加载=)

在我看来,Sergiy 的答案应该是给定问题的选定答案。我正在分享我的理解。

我希望使用我在下面给出的目录结构下的作曲家自动加载我的包文件。

<web-root>
|--------src/
|           |--------App/
|           |
|           |--------Test/
|
|---------library/
|
|---------vendor/
|           |
|           |---------composer/
|           |           |---------autoload_psr4.php
|           |           
|           |----------autoload.php
|
|-----------composer.json
|

我正在使用 psr-4 自动加载规范。

不得不将以下行添加到项目的 composer.json 中。我打算将我的类文件放在 src/App 、src/Test 和库目录中。

"autoload": {
"psr-4": {
"OrgName\AppType\AppName\": ["src/App", "src/Test", "library/"]
}
} 

这几乎是不言自明的。OrgName\AppType\AppName是我想要的命名空间前缀。 例如,对于src/应用程序/控制器/提供者/用户中的类用户.php -

namespace OrgNameAppTypeAppNameControllerProvider; // namespace declaration
use OrgNameAppTypeAppNameControllerProviderUser; // when using the class

另请注意"src/App","src/Test"..来自您的web-root,即您的composer.json所在的地方。 与供应商目录无关,请查看供应商/自动加载.php

现在,如果作曲家安装正确,所需要的只是#composer 更新

作曲家更新后,我的类加载成功。 我观察到的是作曲家在供应商/作曲家/autoload_psr4.php中添加了一行

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Monolog\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
'OrgName\AppType\AppName\' => array($baseDir . '/src/App', $baseDir . '/src/Test', $baseDir . '/library'),
);

这就是作曲家的地图。 对于 psr-0 映射在供应商/作曲家/autoload_classmap.php

只需在 src 文件夹中为指向包含类的文件夹的命名空间创建一个符号链接......

ln -s ../src/AppName ./src/AppName

您在作曲家中的自动加载看起来是一样的...

"autoload": {
"psr-0": {"AppName": "src/"}
}

您的 AppName 命名空间类现在将从您当前的工作目录中的src文件夹中启动一个目录......这应该有效。

自动加载配置确实从供应商目录以下开始。因此,您可能希望更改供应商目录,例如

{
"config": {
"vendor-dir": "../vendor/"
},
"autoload": {
"psr-0": {"AppName": "src/"}
}
}

或者这在您的项目中是不可能的?

相关内容

  • 没有找到相关文章

最新更新