使用Composer的Autoload

时间:2012-10-10 11:53:55

标签: php autoload composer-php

我一直在寻找网络,但在这个问题上没有运气。我在我的composer.json

中使用了这个代码的作曲家自动加载
"autoload": {
    "psr-0": {"AppName": "src/"}
}

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

做这样的事情不起作用:

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

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

6 个答案:

答案 0 :(得分:69)

每个软件包都应该负责自动加载,你想用你定义的软件包中的自动加载类实现什么目标?

如果是应用程序本身的一个解决方法是向加载器实例添加名称空间,如下所示:

<?php

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

答案 1 :(得分:55)

composer documentation表示:

  

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

假设您的“src”目录与“供应商”目录处于同一级别:

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

以下配置绝对正确:

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

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

php composer.phar update

此命令将获取最新版本的依赖项,并更新文件“vendor / composer / autoload_namespaces.php”以匹配您的配置。

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

答案 2 :(得分:22)

还有其他方法可以使用composer 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

快乐自动加载=)

答案 3 :(得分:12)

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

我希望使用我在下面给出的dir结构下的composer自动加载我的包文件。

<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 / App / Controller / Provider / User.php 中的用户类 -

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

use OrgName\AppType\AppName\Controller\Provider\User; // when using the class

另请注意“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'),
);

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

答案 4 :(得分:3)

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

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

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

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

您的AppName命名空间类将从src文件夹中的当前工作目录启动一个目录...应该可以正常工作。

答案 5 :(得分:3)

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

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

或者你的项目不是这样吗?