Доступ к конфигурации модуля в Zend Framework 2


Как я могу получить доступ к конфигурации моего модуля с контроллера?

Author: akond, 2012-01-22

8 answers

Я действительно удивлен тем, насколько это неясно, потому что у меня была точно такая же проблема, и я не мог найти окончательного ответа. Можно было бы подумать, что документация ZF2 что-то скажет об этом. Во всяком случае, методом проб и ошибок я наткнулся на этот чрезвычайно простой ответ:

Внутренние функции контроллера:

$config = $this->getServiceLocator()->get('Config');

Внутренние функции класса модуля (файл Module.php):

$config = $e->getApplication()->getServiceManager()->get('Config');

, тогда как $e является примером Zend\Mvc\MvcEvent


В целом, конфигурация доступна из любого места, где у вас есть доступ к глобальному менеджеру служб, поскольку массив конфигурации зарегистрирован как служба с именем Config. (Обратите внимание на верхний регистр C.)

Это возвращает массив объединения application.config.php (глобальный и локальный) и ваш module.config.php . Затем вы можете получить доступ к элементам массива по мере необходимости.

Несмотря на то, что операция уже довольно старая, я надеюсь, что это сэкономит кому-то час или больше, которые мне потребовались, чтобы получить этот ответ.

 87
Author: tomo, 2016-11-08 16:03:44

Что именно вы хотите сделать в своем контроллере с конфигурацией модуля? Это что-то, чего нельзя сделать, если вместо этого контейнер DI вставит полностью настроенный объект в ваш контроллер?

Например, В книге Роба Аллена "Начало работы с Zend Framework 2" приведен пример внедрения настроенного экземпляра Zend\Db\таблицы в контроллер:

return array(
'di' => array(
    'instance' => array(
        'alias' => array(
            'album' => 'Album\Controller\AlbumController',
        ),
        'Album\Controller\AlbumController' => array(
            'parameters' => array(
                'albumTable' => 'Album\Model\AlbumTable',
            ),
        ),
        'Album\Model\AlbumTable' => array(
            'parameters' => array(
                'config' => 'Zend\Db\Adapter\Mysqli',
        )),
        'Zend\Db\Adapter\Mysqli' => array(
            'parameters' => array(
                'config' => array(
                    'host' => 'localhost',
                    'username' => 'rob',
                    'password' => '123456',
                    'dbname' => 'zf2tutorial',
                ),
            ),
        ),
        ...

Если вам нужно выполнить дополнительную инициализацию после полной загрузки приложения при начальной загрузке вы можете прикрепить метод инициализации к событию начальной загрузки в своем классе модуля. Сообщение в блоге Мэтью Вейера О'Финни приводит такой пример:

use Zend\EventManager\StaticEventManager,
Zend\Module\Manager as ModuleManager

class Module
{
    public function init(ModuleManager $manager)
    {
        $events = StaticEventManager::getInstance();
        $events->attach('bootstrap', 'bootstrap', array($this, 'doMoarInit'));
    }

    public function doMoarInit($e)
    {
        $application = $e->getParam('application');
        $modules     = $e->getParam('modules');

        $locator = $application->getLocator();
        $router  = $application->getRouter();
        $config  = $modules->getMergedConfig();

        // do something with the above!
    }
}

Сработает ли какой-либо из этих подходов?

 7
Author: Jason Grimes, 2012-01-23 04:50:21

Для Beta5 вы можете добавить такую функцию в Module.php

public function init(ModuleManager $moduleManager)
{ 
    $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
    $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
          $config = $e->getApplication()->getConfiguration();
          $controller = $e->getTarget();
          $controller->config = $config;
    });
 }

В контроллере вы можете получить конфигурацию:

print_r($this->config); 
 3
Author: samsonasik, 2012-07-10 18:34:52

Для чтения конфигурации только для модуля ваш модуль должен просто реализовать интерфейс LocatorRegisteredInterface

Перед:

namespace Application;

class Module
{
   // ...
}

После:

namespace Application;

use Zend\ModuleManager\Feature\LocatorRegisteredInterface;

class Module implements LocatorRegisteredInterface
{
   // ...
}

В этой реализации говорится, что LocatorRegistrationListener сохраняет значение модуля в service locator как пространство имен\Модуль

Затем в любом месте вы можете получить доступ к своему модулю:

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        /** @var \Application\Module $module */
        $module = $this->getServiceLocator()->get('Application\Module');
        $moduleOnlyConfig = $module->getConfig();

        // ...
    }
} 
 3
Author: Filipp Qoma, 2014-02-27 10:13:14

Сейчас готов запрос на извлечение , который извлекает класс модуля (так что modules/foo/Module.php Foo\Module класс) из контейнера DI. Это дает несколько преимуществ, но вы также можете захватить этот экземпляр модуля в другой раз, если у вас есть доступ к Zend\Di\Locator.

Если ваш контроллер действий расширяет Zend\Mvc\Controller\ActionController, то ваш контроллер является локатором. Это означает, что при создании экземпляра вашему контроллеру вводится локатор, знающий о модулях. Итак, вы можете вытащить модуль класс из DIC в вашем контроллере. Теперь, когда ваш модуль использует файл конфигурации и сохраняет его внутри экземпляра класса модуля, вы можете создать средство получения доступа к этим данным конфигурации из любого класса с локатором. Вероятно, у вас уже есть средство доступа к вашему модулю Foo\Module::getConfig()

В то время как ZF2 находится в стадии разработки и, возможно, этот код будет изменен позже, в настоящее время эта функция охвачена этим тестом, причем это наиболее важная часть:

$sharedInstance = $locator->instanceManager()->getSharedInstance('ListenerTestModule\Module');

$this->assertInstanceOf('ListenerTestModule\Module', $sharedInstance);

Так и с $sharedInstance ваш класс модуля, вы можете получить доступ к конфигурации оттуда. Я ожидаю скорого сокращения этой функции, но это можно будет сделать только после того, как PR #786 будет объединен в ZF2 master.

 1
Author: Jurian Sluiman, 2012-03-05 08:05:41

Вам необходимо реализовать интерфейс ServiceLocatorAwareИнтерфейс из вашей модели. А затем вы можете установить setServiceLocator() и getServiceLocator(), которые предоставляют вам прямой доступ к менеджеру служб. Взгляните на этот пример кода https://gist.github.com/ppeiris/7308289

 1
Author: ppeiris, 2013-11-04 19:57:41

Я создал модуль с плагином контроллера и помощником просмотра для чтения конфигурации в контроллерах и представлениях. Ссылка на GitHub __ Ссылка на композитора

Установите его через composer

composer require tasmaniski/zf2-config-helper

Зарегистрируйте новый модуль "Confighelper" в вашем config/application.config.php файл

'modules' => array(
    '...',
    'ConfigHelper'
),

Используйте его в контроллере и просматривайте файлы

echo $this->configHelp('key_from_config'); // read specific key from config 

$config = $this->configHelp(); // return config object Zend\Config\Config
echo $config->key_from_config;
 0
Author: tasmaniski, 2015-10-05 17:01:55

Вы также можете получить доступ к любому значению конфигурации в любом месте с помощью этого взлома/трюков

$configReader = new ConfigReader();
$configData = $configReader->fromFile('./config.ini');
$config = new Config($configData, true);
 0
Author: Saurabh Chandra Patel, 2015-12-22 06:59:57