Пространство имен Symfony2 Composer Bundle

Некоторое время я пытаюсь импортировать собственный пакет через композитор, но у меня возникло несколько проблем. Я получил следующую связку:

<?php

namespace Platform\Bundle\PollBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class PlatformPollBundle extends Bundle
{
}

Пакет находится в вендоре / платформе / pollbundle /.

В "основном" 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_names правильно есть следующая строка:

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

Но я получил ошибку:

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

Я пробовал около 100 решений, но ничего не работает. Было бы здорово, если бы кто-нибудь смог мне помочь.

2 ответа

Решение

Пакеты не загружаются композитором, а обрабатываются самим ядром Symfony. В каталоге приложения отредактируйте AppKernel.php следующим образом:

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

Тем временем в файле app/autoload.php зарегистрируйте новое пространство имен. Раньше это было сделано через $loader Например, позвонив $loader->registerNameSpaces(), но теперь вы должны вызвать статический метод на AnnotationRegistry учебный класс:

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

Предложенное мной хакерское исправление, которое, по-видимому, и исправило для вас, было бы запустить php app/console generate:bundle в консоли, чтобы сгенерировать новый пакет с тем же именем, а затем просто заменить каталог этого пакета (в src/) своим пакетом.

Неправильно определять ЛЮБУЮ автозагрузку в основном приложении для всего, что указывает на папку vendor! Для этого и нужен композитор. Composer будет читать объявление автозагрузки для каждого содержащегося в нем пакета и автоматически добавлять соответствующую автозагрузку. Нет необходимости добавлять это самостоятельно.

И даже если вам нужно использовать программное обеспечение, которое еще не добавило файл composer.json, автозагрузка только этого пакета должна идти в блок определения пакета, а не в определение автозагрузки.

Другие вопросы по тегам