作曲家 - 需要我的包/bundle中的另一个包,但它不会自动加载。以其他两种方式解决,但不够干净



我使用Symfony 2.3和Composer,并使用Composer从远程存储库安装我的捆绑包。单独这样做很好,但我遇到的问题是,当我试图从Symfony2捆绑包中要求另一个包时。

我的捆绑包在src/文件夹中。

我已经将其添加到我的捆绑包的composer.json:中

"require": {
    "rackspace/php-opencloud": "1.10.*"
},

所有东西都安装了,但我现在需要确保类是自动加载的(我想是注册命名空间),但它就是做不到

事实上,我已经用另外两种方法解决了这个问题,但它们不够干净。我希望我的捆绑包处理依赖关系,而不是应用程序文件夹或主Symfony2 composer.json.

不够好的解决方案:

(1) 如果我将Rackspace包添加到我的symfony2/composer.json中,那么一切都可以完美运行。但这很糟糕,因为它依赖于我的捆绑包,而不是整个Symfony2框架。

(2) 如果我将这些添加到app/autoload.php,那么它也可以工作:

$loader->add('OpenCloud', __DIR__.'/../src/rackspace/php-opencloud/lib');
$loader->add('Guzzle\Http', __DIR__.'/../src/guzzle/http');
$loader->add('Guzzle\Common', __DIR__.'/../src/guzzle/common');

但这很混乱,而且依赖关系是捆绑包而不是应用程序。

我已经尝试过这种方法的各种变体(在我的捆绑包的composer.json中),但它根本不起作用:

"autoload": {
    "psr-0": { "OpenCloud": ["rackspace/php-opencloud/lib/", "rackspace/php-opencloud/tests/"] }
}

通常,只需要相对路径。

"autoload": {
    "psr-0": { "OpenCloud": ["lib/", "tests/"] }
}

我没有对同一前缀使用多个路径进行测试。这可能不受支持。

您也可以使用classmap自动加载器,它将遍历整个文件夹并从中生成静态映射。不需要前缀。

"autoload": {
    "classmap": ["lib/", "tests/"]
}

然而,我很少看到测试包含在外部应用程序的自动加载中。PHPUnit可以很好地处理类加载。

最新更新