Как я могу получить доступ к моей конфигурации модуля с контроллера?
Доступ к конфигурации модуля в Zend Framework 2
Ответ 1
Я действительно удивлен тем, насколько это неясно, потому что у меня была точно такая же проблема и я не мог найти окончательного ответа. Можно было бы подумать, что в документации 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 сейчас довольно старый, я надеюсь, что это спасет кого-то час или больше, что потребовалось мне для ответа на этот вопрос.
Ответ 2
Что именно вы хотите сделать в своем контроллере с конфигурацией модуля? Это что-то, что невозможно сделать, если контейнер 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 к событию bootstrap в вашем классе Module. A блога Мэтью Вейера О'Финни дает следующий пример:
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!
}
}
Будет ли любой из этих подходов делать трюк?
Ответ 3
для 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);
Ответ 4
Чтобы прочитать конфигурацию только для модулей, ваш модуль должен просто реализовать LocatorRegisteredInterface
До:
namespace Application;
class Module
{
// ...
}
После:
namespace Application;
use Zend\ModuleManager\Feature\LocatorRegisteredInterface;
class Module implements LocatorRegisteredInterface
{
// ...
}
Эта реализация говорит, что LocatorRegistrationListener сохраняет модуль intance в локаторе службы как пространство имен \Module
Затем вы можете получить доступ к вашему модулю:
class IndexController extends AbstractActionController
{
public function indexAction()
{
/** @var \Application\Module $module */
$module = $this->getServiceLocator()->get('Application\Module');
$moduleOnlyConfig = $module->getConfig();
// ...
}
}
Ответ 5
Теперь есть pull request ready, который вытаскивает класс модуля (поэтому класс modules/foo/Module.php Foo\Module
) из контейнер 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
вашим классом модуля вы можете получить доступ к конфигу. Я ожидаю сокращения для этой функции в ближайшее время, но это можно сделать только после того, как PR # 786 был объединен в мастер ZF2.
Ответ 6
Вам необходимо реализовать ServiceLocatorAwareInterface из вашей модели. И тогда вы можете установить setServiceLocator() и getServiceLocator(), которые дают вам прямой доступ к диспетчеру сервиса. Взгляните на этот пример кода https://gist.github.com/ppeiris/7308289
Ответ 7
Я создал модуль с плагином контроллера и рассмотрю помощник для чтения конфигурации в контроллерах и представлениях. ссылка 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;
Ответ 8
вы также можете получить доступ к любому значению конфигурации в любом месте с помощью этих хаков/трюков
$configReader = new ConfigReader();
$configData = $configReader->fromFile('./config.ini');
$config = new Config($configData, true);