Получить глобальный конфиг в Zend Framework 2

Мой вопрос был задан до. Я также хотел бы получить доступ к моим глобальным конфигам (config / {, *.} {Global, local} .php), расположенным в моих личных библиотеках (в каталоге vendor). Ближайший ответ, который, я думаю, я нашел, Вот. Я создал функцию в своем классе

public function getServiceConfig()
{
return array(
'factories' => array(
'funcservice' =>  function(\Zend\ServiceManager\ServiceLocatorInterface $sm) {
$config = $sm->get('config');
}
)
);
}

И это работает, однако я не могу понять, как получить что-либо из результата.

$config = $this->getServiceConfig();
print_r($config);

дает мне

Array
(
[factories] => Array
(
[funcservice] => Closure Object
(
[this] => Tools\Model\StandartFuncs Object
(
[eventIdentifier:protected] => Zend\Mvc\Controller\AbstractActionController

[plugins:protected] =>
[request:protected] =>
[response:protected] =>
[event:protected] =>
[events:protected] =>
[serviceLocator:protected] =>
)

[parameter] => Array
(
[$sm] => <required>
)

)

)
)

и из $config = $this->getServiceConfig()->get('locales'); я получил

Неустранимая ошибка: вызов функции-члена get () для необъекта

1

Решение

Давайте предположим, что у вас есть конфигурационный файл locales locales.local.php:

<?php

return array(
'hostname' => 'http://apachehost'
);

Эти глобальные и локальные файлы конфигурации должны быть в config/autoload папка.

Структура папки:

- root
- config
- autoload
- locales.global.php
- locales.local.php
- application.config.php

Затем вы загружаете их, используя следующую строку в вашем application.config.php, Подробности об этой расширенной конфигурации вы можете прочитать здесь, в документации ZF2

'module_listener_options' => array(
'config_glob_paths' => array(
'config/autoload/{{,*.}global,{,*.}local}.php',
),
)

Теперь вы можете получить доступ к вашей конфигурации с вашего ServiceManager например как это:

$config = $serviceManager->get('Config');

это $config переменная является массивом. Таким образом, вы ничего не можете получить с помощью геттеров. Вы должны использовать обозначение массива:

$locales = $config['locales'];

Если вы действительно хотите использовать геттеры, то вам необходимо выполнить настройку для объекта. Вы можете сделать это с помощью Zend\Config\Config класс как это:

$config = new \Zend\Config\Config($config, false);

Теперь вы можете получить доступ, как вы написали в своем вопросе:

$config->get('locales');

Обновить

Если вы хотите загрузить файлы автоконфигурации из модуля вендора, то обычно копируйте их *.local.php и / или *.global.php файлы, которые поставляются с модулем, в папку автозагрузки и редактируйте скопированные файлы в соответствии с вашими потребностями.

2

Другие решения

Я не думаю, что вы поняли решение, которое пытаетесь реализовать. Фабрика, которую вы добавляете в конфигурацию сервиса, должна возвращать экземпляр вашего библиотечного класса. Причина, по которой вы помещаете его на фабрику, заключается в том, что вы можете вставить в него массив конфигурации. Так что ваш код должен выглядеть примерно так:

public function getServiceConfig()
{
return array(
'factories' => array(
'funcservice' =>  function(\Zend\ServiceManager\ServiceLocatorInterface $sm) {
$config = $sm->get('config');

return new \SomeLibrary($config);
}
)
);
}

(где SomeLibrary имя вашего библиотечного класса в /vendor).

Затем вам нужно будет использовать диспетчер служб для создания экземпляра вашего библиотечного класса всякий раз, когда вам нужен доступ к нему, например, в контроллере:

public function someAction()
{
$yourLibrary = $this->getServiceLocator()->get('funcservice');
}

Это создаст экземпляр вашего библиотечного класса, передав массив конфигурации в качестве конструктора первому параметру. Вам никогда не нужно звонить getServiceConfig() себя, и это ничего не даст.

0

По вопросам рекламы [email protected]