ZF3 - композитор требует модуль -> модуль не может быть инициализирован

Я работаю со скелетным приложением в качестве основы, используя настройку Vagrant/Composer. После первоначальной установки я понял, что мне понадобится модуль LDAP. Затем я запустил composer require zendframework/zend-ldap, который успешно запустился, и нашел файлы в ~/vendor/zendframework/zend-ldap.

Проблема в том, что когда я добавляю 'Zend\Ldap' к ~/config/modules.config.php, я сталкиваюсь со следующей ошибкой:

Fatal error: Uncaught Zend\ModuleManager\Exception\RuntimeException: Module (Zend\Ldap) could not be initialized. in /var/www/vendor/zendframework/zend-modulemanager/src/ModuleManager.php:203 Stack trace: #0 /var/www/vendor/zendframework/zend-modulemanager/src/ModuleManager.php(175): Zend\ModuleManager\ModuleManager->loadModuleByName(Object(Zend\ModuleManager\ModuleEvent))
#1 /var/www/vendor/zendframework/zend-modulemanager/src/ModuleManager.php(97): Zend\ModuleManager\ModuleManager->loadModule('Zend\\Ldap') #2 /var/www/vendor/zendframework/zend-eventmanager/src/EventManager.php(322): Zend\ModuleManager\ModuleManager->onLoadModules(Object(Zend\ModuleManager\ModuleEvent))
#3 /var/www/vendor/zendframework/zend-eventmanager/src/EventManager.php(171): Zend\EventManager\EventManager->triggerListeners(Object(Zend\ModuleManager\ModuleEvent))
#4 /var/www/vendor/zendframework/zend-modulemanager/src/ModuleManager.php(120): Zend\EventManager\EventManager->triggerEvent(Object(Zend\ModuleManager\ModuleEvent))
#5 /var/www/vendor/zendfr in /var/www/vendor/zendframework/zend-modulemanager/src/ModuleManager.php on line 203

Файл ~/config/modules.config.php:

/**
 * List of enabled modules for this application.
 *
 * This should be an array of module namespaces used in the application.
 */
return [
    'Zend\Session',
    'Zend\Mvc\Plugin\Prg',
    'Zend\Mvc\Plugin\Identity',
    'Zend\Mvc\Plugin\FlashMessenger',
    'Zend\Mvc\Plugin\FilePrg',
    'Zend\Log',
    'Zend\Form',
    'Zend\Db',
    'Zend\Router',
    'Zend\Validator',
    'Zend\Ldap',    // All is well if this is commented out
    'Application', 

];

и файл ~/config/application.config.php:

/**
 * If you need an environment-specific system or application configuration,
 * there is an example in the documentation
 * @see https://docs.zendframework.com/tutorials/advanced-config/#environment-specific-system-configuration
 * @see https://docs.zendframework.com/tutorials/advanced-config/#environment-specific-application-configuration
 */
return [
    // Retrieve list of modules used in this application.
    'modules' => require __DIR__ . '/modules.config.php',

    // These are various options for the listeners attached to the ModuleManager
    'module_listener_options' => [
        // This should be an array of paths in which modules reside.
        // If a string key is provided, the listener will consider that a module
        // namespace, the value of that key the specific path to that module's
        // Module class.
        'module_paths' => [
            './module',
            './vendor',
        ],

        // An array of paths from which to glob configuration files after
        // modules are loaded. These effectively override configuration
        // provided by modules themselves. Paths may use GLOB_BRACE notation.
        'config_glob_paths' => [
            realpath(__DIR__) . '/autoload/{{,*.}global,{,*.}local}.php',
        ],

        // Whether or not to enable a configuration cache.
        // If enabled, the merged configuration will be cached and used in
        // subsequent requests.
        'config_cache_enabled' => true,

        // The key used to create the configuration cache file name.
        'config_cache_key' => 'application.config.cache',

        // Whether or not to enable a module class map cache.
        // If enabled, creates a module class map cache which will be used
        // by in future requests, to reduce the autoloading process.
        'module_map_cache_enabled' => true,

        // The key used to create the class map cache file name.
        'module_map_cache_key' => 'application.module.cache',

        // The path in which to cache merged configuration.
        'cache_dir' => 'data/cache/',

        // Whether or not to enable modules dependency checking.
        // Enabled by default, prevents usage of modules that depend on other modules
        // that weren't loaded.
        // 'check_dependencies' => true,
    ],

    // Used to create an own service manager. May contain one or more child arrays.
    // 'service_listener_options' => [
    //     [
    //         'service_manager' => $stringServiceManagerName,
    //         'config_key'      => $stringConfigKey,
    //         'interface'       => $stringOptionalInterface,
    //         'method'          => $stringRequiredMethodName,
    //     ],
    // ],

    // Initial configuration with which to seed the ServiceManager.
    // Should be compatible with Zend\ServiceManager\Config.
    // 'service_manager' => [],
];

Я попытался удалить папку кеша, запустить composer update, перезапустить Vagrant, добавить полный путь к массиву 'modules_path' в application.config.php, но всегда одна и та же ошибка. Интересно, что я столкнулся с той же проблемой с 'Zend\View', которая была включена при установке, но такой модуль, как 'Zend\Session', можно без проблем добавить в файл modules.config.php (все они расположены в каталоге vendor/zendframework)

Может ли кто-нибудь указать мне в правильном направлении, чтобы решить эту проблему?


person HulaHoof    schedule 08.06.2017    source источник
comment
Отключите все 5 параметров, связанных с кешем, в application.config.php, закомментировав. Удалите эти уже кэшированные файлы. Теперь главный, раскомментируйте Zend\Ldap и запустите команду обновления композитора.   -  person unclexo    schedule 08.06.2017
comment
Я закомментировал параметры кеша и запустил composer update, но, к сожалению, я все еще получаю сообщение об ошибке.   -  person HulaHoof    schedule 08.06.2017


Ответы (4)


Zend\Ldap является одним из компонентов ZF. Поскольку в его каталоге /src нет Module.php, который является обязательным для модуля. Таким образом, вам не нужно инициализировать, как другие модули, через modules.config.php, чтобы использовать его в своем приложении.

Этот компонент не включен в стандартную установку ZF. Поэтому, если вы хотите использовать какой-либо компонент, вы должны добавить его в автозагрузчик. Как только вы добавите такой компонент composer require zendframework/zend-ldap в свой проект, вы сможете его использовать.

Проверьте этот ответ и эту проблему, чтобы внести ясность!

person unclexo    schedule 08.06.2017

zend-ldap не имеет файла src/Module.php, поэтому вы не можете добавить его как модуль. Кроме того, похоже, что он не включает стандартную фабрику, поэтому вам нужно написать ее самостоятельно. Подробнее о том, как настроить:

https://zendframework.github.io/zend-ldap/intro/

person xtreamwayz    schedule 08.06.2017

Как уже отмечалось, zend-ldap не предоставляет класс Module; это просто компонент, обеспечивающий функциональность. В нем нет определений службы, поэтому нет класса Module.

Две вещи, которые следует отметить:

  • Установите zendframework/zend-component-installer в свое приложение: composer require --dev zendframework/zend-component-installer. Когда вы это сделаете, каждый раз, когда вы добавляете в свое приложение еще один компонент, предоставляющий класс Module, вам будет предложено добавить его в конфигурацию вашего приложения. (установщик zend-component-installer устанавливается по умолчанию, если вы начинаете свой проект с zendframework/skeleton-application.)
  • Недавно мы открыли наши форумы Zend Framework; подумайте о том, чтобы в будущем направлять свои вопросы ZF туда, чтобы пользователи ZF могли легко найти ответы.
person weierophinney    schedule 08.06.2017

Входит ли zend-ldap в ваш проект? Если не запустить в вашем терминале

composer require zendframework/zend-ldap

И вы можете отключить кеширование в процессе разработки, включив режим разработки: composer development-enable

person Hayk Manasyan    schedule 08.06.2017
comment
Привет, спасибо за ответ, я упомянул в первом абзаце, что начал с запуска этой команды, и я также подтвердил, что файлы находятся в каталоге vendor/zendframework. В настоящее время я также нахожусь в режиме разработчика, я дважды проверил с помощью composer development-status. Не могли бы вы придумать какую-либо другую причину, по которой он не смог бы инициализировать модуль? - person HulaHoof; 08.06.2017
comment
Насколько я знаю, если вы устанавливаете модуль через композитор, вам не нужно добавлять имя модуля в ~/config/modules.config.php . Вы просто используете его. - person Hayk Manasyan; 08.06.2017