У меня есть эта перезагрузка с 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_"