使用Composer的Autoload

Chr*_*s R 67 php autoload composer-php

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

"autoload": {
    "psr-0": {"AppName": "src/"}
}
Run Code Online (Sandbox Code Playgroud)

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

做这样的事情不起作用:

"autoload": {
    "psr-0": {"AppName": "../src/"}
}
Run Code Online (Sandbox Code Playgroud)

有谁知道修复或我如何做到这一点?

Sel*_*aek 71

每个软件包都应该负责自动加载,你试图通过你定义的软件包之外的自动加载类实现什么?

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

<?php

$loader = require 'vendor/autoload.php';
$loader->add('AppName', __DIR__.'/../src/');
Run Code Online (Sandbox Code Playgroud)

  • 请注意,函数```$ loader-> add()```只能使用PSR-0加载.对于PSR-4的加载,请使用```$ loader-> addPsr4()```. (8认同)
  • 这对于测试套件中的自动加载类很有用,但@ chris-r问题的实际解决方案是运行"composer.phar update". (6认同)
  • 非常感谢你,这是两个小时的搜索工作,我发现这个解决方案,非常感谢你,亲爱的 (2认同)
  • @alexndreazevedo谢谢.自从我的项目遵循PSR-4并且使用`add()`无法正确加载时,我将头发撕裂了半个小时.我已经提交了上面答案的更新,提到了正确的`addPsr4()`方法. (2认同)

Ser*_*nko 54

作曲家的文件指出:

添加自动加载字段后,您必须重新运行安装以重新生成vendor/autoload.php文件.

假设你的"src"目录与"vendor"目录位于同一级别:

  • SRC
    • AppName的
  • 供应商
  • composer.json

以下配置绝对正确:

{
    "autoload": {
        "psr-0": {"AppName": "src/"}
    }
}
Run Code Online (Sandbox Code Playgroud)

但您必须重新更新/安装依赖项以使其适用于您,即运行:

php composer.phar update
Run Code Online (Sandbox Code Playgroud)

此命令将获得依赖的最新版本和更新文件"供应商/作曲/ autoload_namespaces.php",以配合您的配置.

同样如@Dom所述,您可以使用composer dump-autoload更新自动加载器而无需进行更新.

  • 你不只是需要运行`composer dump-autoload'吗? (6认同)

Fra*_*ula 23

还有其他方法可以使用composer autoload功能.加载没有名称空间的程序包或自定义自动加载功能附带的程序包可能有用的方法.

例如,如果您想要包含一个包含自动加载功能的文件,您可以使用"files"指令,如下所示:

"autoload": {
    "psr-0": {
        "": "src/",
        "SymfonyStandard": "app/"
    },
    "files": ["vendor/wordnik/wordnik-php/wordnik/Swagger.php"]
},
Run Code Online (Sandbox Code Playgroud)

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');
Run Code Online (Sandbox Code Playgroud)

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

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

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

./composer.phar dump-autoload
Run Code Online (Sandbox Code Playgroud)

快乐自动加载=)


nay*_*yak 11

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

我正在寻找使用composer自动加载我的包文件,我在下面给出的dir结构下.

<web-root>
    |--------src/
    |           |--------App/
    |           |
    |           |--------Test/
    |
    |---------library/
    |
    |---------vendor/
    |           |
    |           |---------composer/
    |           |           |---------autoload_psr4.php
    |           |           
    |           |----------autoload.php
    |
    |-----------composer.json
    |
Run Code Online (Sandbox Code Playgroud)

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

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

"autoload": {
        "psr-4": {
            "OrgName\\AppType\\AppName\\": ["src/App", "src/Test", "library/"]
        }
    } 
Run Code Online (Sandbox Code Playgroud)

这几乎是自我解释.OrgName\AppType\AppName是我想要的命名空间前缀.例如,对于src/App/Controller/Provider/User.php中的类用户-

namespace OrgName\AppType\AppName\Controller\Provider; // namespace declaration

use OrgName\AppType\AppName\Controller\Provider\User; // when using the class
Run Code Online (Sandbox Code Playgroud)

另请注意"src/App","src/Test"..来自您的composer.json所在的web-root.与供应商目录无关.看一下vendor/autoload.php

现在如果正确安装了composer,那么所需的只是 #composer update

在作曲家更新后,我的类成功加载.我观察到的是作曲家在vendor/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'),
);
Run Code Online (Sandbox Code Playgroud)

这就是作曲家映射的方式.对于psr-0映射在vendor/composer/autoload_classmap.php中