Zend Framework 2идет со стандартным автозагрузчиком модулей Zend\Loader\ModuleAutoloader. Он отвечает за обнаружение и загрузку модулей, находящихся в разных местах.
Использование автозагрузчика модулей (Module Autoloader)
По-умолчанию, Zend\ModuleManager\Listener\DefaultListenerAggregateнастраивает (setsup) ModuleAutoloader, а разработчику просто необходимо указать массив путей к модулям: абсолютный или относительный к корневой папке приложения. DefaultListenerAggregate будет сам создавать экземпляры и регистрации ModuleAutoloader для Вас.
Важно:Для нормальной работы приложения с указанными путями у Вас в файле public/index.php должна быть директива:
/** * This makes our life easier when dealing with paths. Everything is relative * to the application root now. */ chdir(dirname(__DIR__));
Регистрация пути модуля с помощью DefaultListenerAggregate
В следующем примере будут искаться модули в трех различных module_paths. Два из них являются локальными относительно приложения, а третий – общесистемным.
// public/index.php use Zend\ModuleManager\Listener; use Zend\ModuleManager\ModuleManager; chdir(dirname(__DIR__)); // Instantiate and configure the default listener aggregate $listenerOptions = new Listener\ListenerOptions(array( 'module_paths' => array( './module', './vendor', '/usr/share/zfmodules', ) )); $defaultListeners = new Listener\DefaultListenerAggregate($listenerOptions); // Instantiate the module manager $moduleManager = new ModuleManager(array( 'Application', 'FooModule', 'BarModule', )); // Attach the default listener aggregate and load the modules $moduleManager->getEventManager()->attachAggregate($defaultListeners); $moduleManager->loadModules();
Важно: Пути модулей схожи с «include_path» в PHP и ищутся в порядке их объявления. Если у Вас имеются модули с одинаковыми названиями в зарегистрированных путях, то вернется первый найденный.
Non-Standard / Explicit Module Paths
Иногда возникает необходимость указать точный путь к модулю
вместо использования Zend\Loader\ModuleAutoloader.
В следующем примере автозагрузчик сначала проверит «MyModuleModule» в «/path/to/mymoduledir-v1.2/Module.php» . если же он его не найдет, тогда начнется поиск по другим зарегистрированным путям для модулей:
// ./public/index.php use Zend\Loader\ModuleAutoloader; use Zend\ModuleManager\Listener; use Zend\ModuleManager\ModuleManager; chdir(dirname(__DIR__)); // Instantiate and configure the default listener aggregate $listenerOptions = new Listener\ListenerOptions(array( 'module_paths' => array( './module', './vendor', '/usr/share/zfmodules', 'MyModule' => '/path/to/mymoduledir-v1.2', ) )); $defaultListeners = new Listener\DefaultListenerAggregate($listenerOptions); /** * Without DefaultListenerAggregate: * * $moduleAutoloader = new ModuleAutoloader(array( * './module', * './vendor', * '/usr/share/zfmodules', * 'MyModule' => '/path/to/mymoduledir-v1.2', * )); * $moduleAutoloader->register(); * */ // Instantiate the module manager $moduleManager = new ModuleManager(array( 'MyModule', 'FooModule', 'BarModule', )); // Attach the default listener aggregate and load the modules $moduleManager->getEventManager()->attachAggregate($defaultListeners); $moduleManager->loadModules();
Этот метод так же пригоден для использования с «phar» архивом.
Упаковка модулей с помощью Phar
Если вы предпочитаете, вы можете легко упаковать модуль в архив Phar. Стандартный автозагрузчик способен загружать модули из следующих форматов архивов:
.phar,
.phar.gz,
.phar.bz2,
.phar.tar,
.phar.tar.gz,
.phar.tar.bz2,
.phar.zip,
.tar,
.tar.gz,
.tar.bz2,
.zip.
Например, Вы можете упаковать папку MyModule в архив MyModule.tar и он легко сможет подгрузить или изменять этот модуль!
Важно: Если возможно, избегайте использования любых типов сжатия (bz2, GZ, ZIP) для phar архива, так как это вызовет ненужную дополнительную нагрузку на процессор при каждом запросе.