Пакет Zend-Config представляет простой механизм для работы с конфигурацией приложения. Он включает класс Config
, представляющий данные конфигурации и предоставляющий объектный интерфейс доступа к ним. Для начала рассмотрим несколько примеров:
При инстанциации этого класса ему необходимо передать массив конфигурации в качестве первого параметра. Конструктор класса так же принимает второй, булевый параметр, который определяет, является ли конфигурация неизменяемой (read only) или нет:
Получить доступ к данным конфигурации можно так же с помощью метода get
, который принимает помимо имени целевой опции, так же значение по умолчанию, которое будет возвращено в случае, если опция отсутствует:
В том случае, если необходимо слить две конфигурации в одну, можно воспользоваться методом merge
:
Чтение и запись конфигураций
Для чтения или записи конфигураций, используются классы из пространств имен Zend\Config\Reader
и Zend\Config\Writer
соответственно. Семантика этих классов определяется интерфейсами ReaderInterface
и WriterInterface
, а именно следующими методами:
ReaderInterface
fromString
- чтение данных конфигурации из строкиfromFile
- чтение данных конфигурации из файла
WriterInterface
toString
- запись конфигурации в строкуtoFile
- запись конфигурации в файл
Для начала рассмотрим простой пример реализации собственных классов для чтения конфигурации из PHP скрипта, содержащего массив конфигурации, а так же записи в этот файл:
Следует помнить, что все методы интерфейсов могут принимать как массив конфигурации, так и экземпляр класса
Config
, что требует правильной обработки. Для преобразования конфигурации в массив можно использовать методtoArray
, как показано в примере выше.
Пакет Zend-Config включает множество готовых кассов для чтения и записи конфигураций, которые вы можете использовать вместо собственной реализации:
ReaderInterface
Ini
- чтение из формата INIJson
- чтение из формата JSONXml
- чтение из формата XMLYaml
- чтение из формата YAMLJavaProperties
- чтение из формата JavaProperties
WriterInterface
PhpArray
- запись в формат массива PHPIni
- запись в формат INIJson
- запись в формат JSONXml
- запись в формат XMLYaml
- запись в формат YAML
С использованием перечисленных классов наш код из предыдущего примера будет выглядить так:
Процессоры
Иногда конфигурация приложения нуждается в дополнительной обработке перед использованием, к примеру, для замены всех вхождений констант на их значения. Для реализации этой логики используются классы пространства имен Zend\Config\Processor
. Семантику этих классов описывает интерфейс ProcessorInterface
, включающий два метода:
processValue
- обработка и преобразование значения конфигурацииprocess
- обработка конфигурации в целом
Попробуем реализовать собственный процессор с использованием этого интерфейса:
В пакет Zend-Config входят следующие процессоры:
Token
- выполняет замену вхождений указанных токеновConstant
- частный случайToken
, выполняющий замену вхождений константFilter
- выполняет обработку значений конфигурации с помощьюZend\Filter
Translator
- выполняет локализацию значений конфигурации с помощьюZend\I18n
Queue
- объединяет несколько процессоров в один
Фабрика конфигураций
Класс Factory
предоставляет удобный интерфейс доступа к конфигурациям с помощью следущих статичных методов:
fromFile
- чтение конфигурации из файлаfromFiles
- чтение конфигурации из нескольких файловtoFile
- запись конфигурации в файл
Удобство данного класса в том, что он использует расширение файла для выбора подходящего Reader
и Writer
в каждом конкретном случае:
Этот пример показывает, как можно с помощью класса Factory
объединить конфигурации разных форматов (PHP, JSON, XML) в один файл (YAML).
Методы
fromFiles
иfromFile
в качестве второго параметра принимают булевое значение, определяющее в каком виде должна быть возвращена конфигурация: true - в виде экземпляра классаConfig
, false - в виде массива.
Организация конфигураций приложения
В приложении полезно разделять конфигурацию на несколько файлов, объединяя ее во время использования. Группируются конфигурации по следующим правилам:
- Глобальные и модульные конфигурации - общие настройки системы, относящиеся к инфраструктуре (на пример, конфигурация доступа к базе данных), должны располагаться в файлах общих конфигураций, а прикладные конфигурации в файлах модулей
- Конфигурации разработки и развертывания - часто конфигурации для разработки и развертывания требуют различных данных, в этом случае полезно использовать два объединяемых файла конфигурации
develop
иproduction
Рассмотрим пример организации конфигураций в модульном приложении:
При старте приложения необходимо объединять глобальные и модульные конфигурации, исключая production
и develop
конфигурацию в зависимости от окружения:
Для автоматизации процесса подключения конфигураций можно так же использовать переменные окружения:
В таком случае при запуске сервера с переменной окружения env
, приложением будут загружены соответствующие ей конфигурации.