Я интегрирую Zend Framework в существующее приложение. Я хочу переключить приложение на механизм автозагрузки Zend, чтобы заменить десятки операторов include()
.
Однако у меня есть специальное требование для механизма автозагрузки. Позвольте мне уточнить.
В существующем приложении используется базовая библиотека (независимо от ZF), например:
/Core/Library/authentication.php /Core/Library/translation.php /Core/Library/messages.php
эта основная библиотека должна оставаться неизменной в любое время и обслуживать несколько приложений. Библиотека содержит классы, такие как
class ancestor_authentication { ... } class ancestor_translation { ... } class ancestor_messages { ... }
в приложении есть также каталог библиотеки:
/App/Library/authentication.php /App/Library/translation.php /App/Library/messages.php
они включают в себя расширение классов предков и те, которые фактически получают экземпляр в приложении.
class authentication extends ancestor_authentication { } class translation extends ancestor_translation { } class messages extends ancestor_messages { }
обычно эти определения классов пустые. Они просто расширяют своих предков и предоставляют имя класса для создания экземпляра.
$authentication = new authentication();
Цель этого решения – легко настраивать аспекты приложения без необходимости исправления основных библиотек.
Теперь автозагрузчик, который мне нужен, должен знать об этой структуре. Когда запрашивается объект authentication
класса, автозагрузчик должен:
1. load /Core/Library/authentication.php 2. load /App/Library/authentication.php
Моим нынешним подходом было бы создание пользовательской функции и привязка к Zend_Loader_Autoloader
для определенного префикса пространства имен.
Есть ли способ сделать это в Zend, что я пропускаю? Принятый ответ в этом вопросе подразумевает, что существует, но это может быть просто плохим выбором формулировки.
Существуют ли расширения для автозагрузчика Zend, которые это делают?
Можете ли вы – я новичок в ZF – подумайте об элегантном способе, соответствующем духу каркаса, о расширении Autoloader с помощью этой функции? Мне не нужно искать готовые реализации, некоторые указатели (это должно быть расширение метода xyz
которое вы бы назвали так …) уже было бы достаточно.
Чтобы расширить то, что уже указал Гордон , я бы создал свой собственный класс автозагрузчика, который реализует Zend_Loader_Autoloader_Interface
и нажимает его на Zend_Loader_Autoloader
-stack.
class My_Autoloader implements Zend_Loader_Autoloader_Interface { public function autoload($class) { // add your logic to find the required classes in here } } $autoloader = Zend_Loader_Autoloader::getInstance(); // pushAutoloader() or unshiftAutoloader() depending on where // you'd like to put your autoloader on the stack // note that we leave the $namespace parameter empty // as your classes don't share a common namespace $autoloader->pushAutoloader(new My_Autoloader(), '');
Я бы не пошел с подходом Zend_Loader
поскольку, несмотря на то, что он еще не устарел, новый Zend_Loader_Autoloader
видимому, сейчас является лучшей практикой.
См. Руководство по Zend_Loader :
По умолчанию автозагрузчик настроен на соответствие пространствам имен «Zend_» и «ZendX_». Если у вас есть собственный код библиотеки, который использует ваше собственное пространство имен, вы можете зарегистрировать его с помощью автозагрузчика, используя метод registerNamespace ().
$autoloader->registerNamespace('My_');
Обратите внимание, что автозагрузчик следует за ZF Naming Convention, поэтому Zend_Foo_Bar
будет выглядеть в Zend/Foo/Bar.php
.
Однако,
Вы также можете регистрировать произвольные обратные вызовы автозагрузчика, опционально с определенным пространством имен (или группой пространств имен). Zend_Loader_Autoloader попытается сопоставить эти данные перед использованием внутреннего механизма автоматической загрузки.
$autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');
Другой способ – создать пользовательский класс Loader, расширяющий Zend_Loader, а затем зарегистрировать его с помощью:
Zend_Loader::registerAutoload('My_Loader');
Затем ZF будет использовать этот автозагрузчик вместо стандартного.