Мой вопрос был задан до. Я также хотел бы получить доступ к моим глобальным конфигам (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 () для необъекта
Давайте предположим, что у вас есть конфигурационный файл 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
файлы, которые поставляются с модулем, в папку автозагрузки и редактируйте скопированные файлы в соответствии с вашими потребностями.
Я не думаю, что вы поняли решение, которое пытаетесь реализовать. Фабрика, которую вы добавляете в конфигурацию сервиса, должна возвращать экземпляр вашего библиотечного класса. Причина, по которой вы помещаете его на фабрику, заключается в том, что вы можете вставить в него массив конфигурации. Так что ваш код должен выглядеть примерно так:
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()
себя, и это ничего не даст.