Автозагрузчики ресурсов Zend не работают в пространствах имен

У меня есть эта перезагрузка с Zend Framework. В основном папка с именем LunaZend находится в папке библиотеки. LunaZend имеет несколько классов, которые могут использоваться в Zend Framework, и эти классы имеют пространства имен и должны загружаться автоматически только путем вызова имен пространства имен. Пространства имен похожи на LunaZend \ DB, LunaZend \ Etc … В bootstrap у меня есть функция _initAutoLoadNS, которая имеет

$resource = new Zend_Loader_Autoloader_Resource(array( 'basePath' => APPLICATION_PATH.'/../library/LunaZend/', 'namespace' => 'LunaZend') ); 

Я хочу иметь возможность загружать классы в Zend Framework только путем вызова типа

 $t = new LunaZend\Di\DependencyInjector(); 

Однако я получаю ошибку

Неустранимая ошибка: класс «LunaZend \ Di \ DependencyInjector» не найден в … Что я делаю неправильно? Как справиться с этой проблемой автозагрузки пространства имен?

Спасибо.

Да, ну, этот вопрос, кажется, всплывает время от времени, пока в ZF не появятся пространства имен (родные). Вот мое занятие. Это для всех вас, кто просто хочет правильно загрузить некоторую третью сторону, использующую пространства имен . Это просто.

Я использую ZF 1.11.11 (согласно документации, все версии ZF 1.10+ работают).

Прежде всего, с 1.10 ZF поддерживает автозагрузку собственных пространств имен PHP при условии, что они соответствуют стандарту PSR-0 .

Я хотел добавить компонент Symfony2 EventManager в проект ZF1.
Прежде всего, как и имена классов, пространство имен должно соответствовать пути в библиотеке. Итак, пространство имен Symfony\Component\EventDispatcher\EventDispatcher отображает path/to/lib/Symfony/Component/EventDispatcher/EventDispatcher.php (где path/to/lib/ является APPLICATION_PATH . '/library' , вы получаете идею). Должен ли я упоминать, что папка библиотеки должна быть в include_path? Нет, полагаю, я этого не делаю.

Теперь с не очень-сложной частью:

 <?php // bootstrap.php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initNsAutoload() { $loader = Zend_Loader_Autoloader::getInstance(); $loader->registerNamespace('Symfony'); // this is why is dead simple /* Don't believe me? Try it: Zend_Registry::set('events', new Symfony\Component\EventDispatcher\EventDispatcher()); */ } } 

Как использовать импорт имён в контроллерах?

 <?php use Symfony\Component\EventDispatcher\Event, Symfony\Component\EventDispatcher\EventDispatcher; class IndexController extends Zend_Controller_Action { public function indexAction() { var_dump(new EventDispatcher()); var_dump(new Event()); } } 

Итак, пока вы используете ZF 1.10+, нет необходимости в настраиваемом автозагрузчике. Этот ответ был сделан после того, как я посмотрел на это .

LE: или добавьте это в application.ini :
autoloaderNamespaces[] = Symfony

AFAIK, автозагрузчик ZF1 не обрабатывает настоящие классы имен PHP 5.3 . Чтобы использовать автозагрузчик ZF1 для настоящих классов с именами, вам нужно настроить переменную разделителя как \ . (Спасибо @Mattieu за исправление). Но Zend_Loader_Autoloader_Resource не обрабатывает отображение пути, как мы могли ожидать.

Вы можете использовать автозагрузчик, поддерживающий пространство имен, как и для Doctrine2 или ZF2. Нажатие одного из этих автозагрузчиков на стандартный стековый автозагрузчик ZF1 должно обрабатывать его.

Вы можете использовать application.ini для загрузки некоторого пространства имен.

Я использовал то же самое

Следующим может быть пример кода application.ini:

 [production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 appnamespace = "Application" ;Autoloader Namespace autoloaderNamespaces.w = "LunaZend_"