Содержание


The Module Autoloader


The Module Autoloader




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


Автор статьи: DuB