Symfony2 Composer Bundle命名空间

时间:2014-03-31 12:26:35

标签: php symfony composer-php symfony-2.3 autoloader

我正在尝试通过作曲家导入自己的包但我遇到了一些问题。我得到了以下捆绑:

<?php

namespace Platform\Bundle\PollBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class PlatformPollBundle extends Bundle
{
}

该捆绑包位于 vendor / platform / pollbundle /

在“main” composer.json 中,我确定了自动加载的命名空间:

"autoload": {
    "psr-0": {
        "": "src/" ,
        "Platform\\": "vendor/platform"
    }
},

并在我确定的包中的 composer.json 中:

{
    "name" : "platform/pollbundle",
    "type": "symfony-bundle",
    "extra": {
        "servicePath": ""
    },
    "autoload": {
        "psr-0": {
            "Platform\\Bundle\\PollBundle": ""
        }
    },
    "target-dir": "pollbundle"

}

在autoload_namespaces中,有正确的行:

'Platform\\' => array($vendorDir . '/platform'),

但是我得到了错误:

Fatal error: Class 'Platform\Bundle\PollBundle\PlatformPollBundle' not found in     ........Controller.php on line 13

我尝试了大约100种解决方案,但没有任何效果。如果有人可以帮助我会很棒。

2 个答案:

答案 0 :(得分:1)

捆绑包不是由作曲家加载的,而是由Symfony内核本身处理。在app目录中,像这样编辑AppKernel.php:

public function registerBundles()
{
    $bundles = array(
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        ...,
        new Platform\Bundle\PollBundle\PlatformPollBundle()//<-- add this
    );
}

同时在app / autoload.php文件中注册新的namesepace。过去通过调用$loader通过$loader->registerNameSpaces()实例完成,但现在,您必须在AnnotationRegistry类上调用静态方法:

AnnotationRegistry::registerAutoloadNamespace('PollBundle', 'path/to/PollBundle');

我建议的一个hacky修复,显然是为你修复的,是在控制台中运行php app/console generate:bundle,生成一个具有相同名称的新包,然后简单地替换该包&#39; s目录(在src /中)和你的包。

答案 1 :(得分:0)

在主应用程序中为任何指向vendor文件夹的内容定义任何自动加载是错误的!这就是作曲家的用武之地。 Composer将读取其中包含的每个包的自动加载声明,并自动添加适当的自动加载。没有必要自己添加。

即使您必须使用尚未添加composer.json文件的软件,只有该软件包的自动加载应该进入软件包定义块,而不是自动加载定义。