Пространство имен 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, автозагрузка только этого пакета должна идти в блок определения пакета, а не в определение автозагрузки.