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

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

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

Я действительно удивлен тем, насколько это неясно, потому что у меня была такая же проблема и я не мог найти окончательного ответа. Можно было бы подумать, что в документации 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. Затем вы можете получить доступ к элементам массива, как вам нужно.

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

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

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

 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', ), ), ), ... 

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

 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! } } 

Может ли любой из этих подходов сделать трюк?

для 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); 

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

До:

 namespace Application; class Module { // ... } 

После:

 namespace Application; use Zend\ModuleManager\Feature\LocatorRegisteredInterface; class Module implements LocatorRegisteredInterface { // ... } 

Эта реализация говорит LocatorRegistrationListener, чтобы сохранить ввод модуля в локаторе службы в качестве пространства имен \ Module

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

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

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

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

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

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

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

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

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

Установите его через композитор

 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; 

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

 $configReader = new ConfigReader(); $configData = $configReader->fromFile('./config.ini'); $config = new Config($configData, true);