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