Доступ к конфигурации модуля в Zend Framework 2
Как я могу получить доступ к конфигурации моего модуля с контроллера?
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 . Затем вы можете получить доступ к элементам массива по мере необходимости.
Несмотря на то, что операция уже довольно старая, я надеюсь, что это сэкономит кому-то час или больше, которые мне потребовались, чтобы получить этот ответ.
Что именно вы хотите сделать в своем контроллере с конфигурацией модуля? Это что-то, чего нельзя сделать, если вместо этого контейнер 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!
}
}
Сработает ли какой-либо из этих подходов?
Для 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 сохраняет значение модуля в service locator как пространство имен\Модуль
Затем в любом месте вы можете получить доступ к своему модулю:
class IndexController extends AbstractActionController
{
public function indexAction()
{
/** @var \Application\Module $module */
$module = $this->getServiceLocator()->get('Application\Module');
$moduleOnlyConfig = $module->getConfig();
// ...
}
}
Сейчас готов запрос на извлечение , который извлекает класс модуля (так что 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.
Вам необходимо реализовать интерфейс ServiceLocatorAwareИнтерфейс из вашей модели. А затем вы можете установить setServiceLocator() и getServiceLocator(), которые предоставляют вам прямой доступ к менеджеру служб. Взгляните на этот пример кода https://gist.github.com/ppeiris/7308289
Я создал модуль с плагином контроллера и помощником просмотра для чтения конфигурации в контроллерах и представлениях. Ссылка на 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;
Вы также можете получить доступ к любому значению конфигурации в любом месте с помощью этого взлома/трюков
$configReader = new ConfigReader();
$configData = $configReader->fromFile('./config.ini');
$config = new Config($configData, true);