Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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);