Получить глобальный конфиг в 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() для необъекта

2 ответа

Давайте предположим, что у вас есть конфигурационный файл 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 файлы, поставляемые с модулем, в папку автозагрузки и редактируйте скопированные файлы в соответствии с вашими потребностями.

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

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() себя, и это ничего не даст.

Другие вопросы по тегам