A free and open-source book on ZF3 for beginners


3.8. Конфигурация приложения

Большинство компонентов Zend Framework, используемых на вашем сайте, требуют конфигурации (тонкой настройки). Например, в файле конфигурации вы можете установить настройки подключения для базы данных, определить, какие модули присутствуют в вашем приложении и добавить некоторые пользовательские параметры.

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

Некоторые PHP-фреймворки предпочитают принцип соглашения превыше конфигурации (Сonvention over Сonfiguration), при котором большинство параметров жестко закодированы и не требуют конфигурации. Это ускоряет разработку приложения, но делает его менее настраиваемым. В Zend Framework 3 используется принцип конфигурация превыше соглашений, то есть, вы можете настроить каждый аспект вашего приложения, но вам придется потратить немного времени прежде, чем вы научитесь это делать.

3.8.1. Файлы настройки на уровне приложения

Подкаталог APP_DIR/config содержит файлы конфигурации, действующие для всего приложения. Рассмотрим этот подкаталог более детально (рисунок 3.4).

Рисунок 3.4. Конфигурационные файлы Рисунок 3.4. Конфигурационные файлы

Файл APP_DIR/config/application.config.php - это основной файл конфигурации. Он используется приложением при запуске для определения, какие модули приложения должны быть загружены и какие сервисы созданы по умолчанию.

Ниже представлено содержимое файла application.config.file. Как видите, файл конфигурации является обычным вложенным ассоциативным массивом, и каждый компонент этого массива может иметь особый ключ. Вы можете оставить комментарии к этим ключам, чтобы другим было проще понять, что означает каждый из них.

Принято давать ключам имена в нижнем регистре, и, если имя ключа состоит из нескольких слов, их следует разделять нижним подчеркиванием ('_').

return [
    // Извлекаем список модулей, используемых в этом приложении.
    'modules' => require __DIR__ . '/modules.config.php',

    // Существует несколько вариантов для обработчиков, прикрепленных к ModuleManager
    'module_listener_options' => [
        // Это должен быть массив путей, в которых находятся модули.
        // Если есть строка с ключом, обработчик посчитает ее пространством имен модуля,
        // значение этого ключа - путем к классу 
        // Module этого модуля.
        'module_paths' => [
            './module',
            './vendor',
        ],

        // Массив путей, для которых используется функция glob (поиск пути к файлам) после
        // загрузки модуля. Таким образом, настройки, предоставляемые модулем, переопределяются.
        // Пути могут иметь флаг GLOB_BRACE.
        'config_glob_paths' => [
            realpath(__DIR__) . '/autoload/{{,*.}global,{,*.}local}.php',
        ],

        // Включать или нет кэш конфигурации.
        // Если он включен, файлы конфигурации после слияния будут кэшированы
        // и использованы при последующих запросах.
        'config_cache_enabled' => true,

        // Ключ, используемый для создания имени файла кэша конфигурации.
        'config_cache_key' => 'application.config.cache',

        // Включать или нет кэш карты классов модуля.
        // Если он включен, создается кэш карты классов модуля, который будет использоваться
        // при последующих запросах для сокращения времени автозагрузки.
        'module_map_cache_enabled' => true,

        // Ключ, используемый для создания имени файла кэша карты классов.
        'module_map_cache_key' => 'application.module.cache',

        // Путь, в который кэшируется конфигурация после слияния.
        'cache_dir' => 'data/cache/',

        // Включать или нет проверку зависимостей модулей (включена по умолчанию).
        // Это предотвращает использование модулей, который зависит от других, не
        // загруженных модулей.
        // 'check_dependencies' => true,
    ],

    // Используется для создания собственного менеджера сервисов. Может содержать один или несколько дочерних массивов.
    //'service_listener_options' => [
    //     [
    //         'service_manager' => $stringServiceManagerName,
    //         'config_key'      => $stringConfigKey,
    //         'interface'       => $stringOptionalInterface,
    //         'method'          => $stringRequiredMethodName,
    //     ],
    // ],

   // Начальная конфигурация, которая подается ServiceManager'у.
   // Должна быть совместима с Zend\ServiceManager\Config.
   // 'service_manager' => [],
];

В строке 3 у нас есть ключ modules, определяющий, какие модули будут загружены при запуске. Как вы видите, имена модулей хранятся внутри другого файла конфигурации modules.config.php, который содержит список всех модулей вашего сайта.

В строке 11 находится ключ module_paths, который сообщает ZF3 о каталогах, в которых нужно искать файлы источников, принадлежащие модулям. Модули приложения, разрабатываемые вами, находятся в каталоге APP_DIR/module, а сторонние модули - в каталоге APP_DIR/vendor.

Наконец, строка 19 содержит ключ config_glob_paths, который сообщает ZF3, где искать дополнительные файлы конфигурации. Как видите, файлы из каталога APP_DIR/config/autoload с суффиксами global.php или local.php загружаются автоматически.

Итак, как правило, вы используете главный файл настроек application.config.php для хранения информации о том, какие модули должны быть загружены, а также их местоположение и способ загрузки (здесь, например, вы можете управлять настройками кэширования). В этом файле вы помимо этого можете настроить менеджер сервисов. Не рекомендуется добавлять дополнительные ключи в этот файл. Для этой цели лучше использовать файл autoload/global.php.

Давайте также заглянем внутрь файла modules.config.php. На данный момент у вас установлены следующие модули:

return [
    'Zend\Session',
    'Zend\Mvc\Plugin\Prg',
    'Zend\Mvc\Plugin\Identity',
    'Zend\Mvc\Plugin\FlashMessenger',
    'Zend\Mvc\Plugin\FilePrg',
    'Zend\Form',
    'Zend\Router',
    'Zend\Validator',
    'Application',
];

Модуль Application - это модуль, содержащий файлы вашего приложения. Все остальные перечисленные модули - это компоненты Zend Framework 3.

В ZF3 был представлен специальный плагин Composer'a, называемый установщиком компонентов. Если помните, в главе Zend Skeleton Application, мы отвечали на несколько вопросов об установщике, определяя, какие компоненты устанавливать. И установщик вставил имена этих модулей здесь, в файле modules.config.php

3.8.2. Дополнительные файлы конфигурации на уровне приложения

"Дополнительные" файлы конфигурации, APP_DIR/config/autoload/global.php и APP_DIR/config/autoload/local.php определяют соответственно не зависимые и зависимые от окружения настройки, применимые для всего приложения. Эти файлы конфигурации загружаются автоматически и рекурсивно сливаются с файлами конфигурации, предоставляемыми модулями, поэтому их каталог называется autoload.

Имея несколько файлов конфигурации в каталоге APP_DIR/config/autoload, вы, возможно, запутаетесь с тем, какие параметры в какой файл поместить. Вот несколько советов:

Так как файл autoload/local.php содержит зависимые от окружения параметры, в системе контроля версий вы храните его "шаблон распределения" local.php.dist. Каждый разработчик вашей команды затем переименовывает файл local.php.dist в local.php и вводит свои собственные параметры. Файл local.php не следует хранить под системой контроля версий, потому что он может хранить чувствительную информацию вроде учетных данных БД (логины и пароли), и вы, скорее всего, не захотите, чтобы их увидели другие.

3.8.3. Файл конфигурации разработки на уровне приложения

С файлом конфигурации разработки (APP_DIR/config/development.config.php) вы столкнетесь при включении режима разработки. Если помните, мы включали этот режим ранее в главе Zend Skeleton Application.

Режим разработки включается следующей командой:

php composer.phar development-enable

Файл development.config.php сливается с главным файлом application.config.php. Это позволяет вам переопределить некоторые параметры. Например, вы можете:

Если вы выключите режим разработки, файл development.config.php будет удален. Поэтому хранить этот файл под системой контроля версий не стоит. Вместо этого храните таким образом его вариант распределения, development.config.php.dist.

3.8.4. Дополнительные файлы разработки на уровне приложения

Дополнительный файл конфигурации приложения в режиме разработки (APP_DIR/config/autoload/development.local.php) присутствует только тогда, когда вы включаете режим разработки.

Файл development.local.php сливается с другими файлами конфигурации уровня модуля. Это позволяет вам переопределить некоторые параметры конфигурации в режиме разработки.

Если вы выключите режим разработки, файл development.local.php будет удален. Поэтому хранить этот файл под системой контроля версий не стоит. Вместо этого храните таким образом его вариант распределения, development.local.php.dist.

3.8.5. Файлы конфигурации на уровне модуля

Как видно из рисунка 3.4, у модуля Application есть файл module.config.php, в котором хранятся параметры, специфичные для этого модуля. Взглянем на файл module.config.php модуля Application:

<?php
namespace Application;

use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;

return [
    'router' => [
        'routes' => [
            'home' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'application' => [
                'type'    => Segment::class,
                'options' => [
                    'route'    => '/application[/:action]',
                    'defaults' => [
                        'controller'    => Controller\IndexController::class,
                        'action'        => 'index',
                    ],
                ],
            ],
        ],
    ],
    'controllers' => [
        'factories' => [
            Controller\IndexController::class => InvokableFactory::class,
        ],
    ],
    'view_manager' => [
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => [
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ],
        'template_path_stack' => [
            __DIR__ . '/../view',
        ],
    ],
];

В этом файле вы регистрируете контроллеры модуля, помещаете в него информацию о правилах маршрутизации для определения соответствия между URL и вашими контроллерами, регистрируете плагины контроллеров, а также регистрируете шаблоны представления и помощники представления (мы узнаем больше об этих терминах в этой и следующих главах).

3.8.6. Объединение файлов конфигурации

При создании приложения, файлы конфигурации, предоставляемые модулем, и дополнительные файлы конфигурации из каталога APP_DIR/config/autoload соединяются в один большой вложенный массив, так что каждый параметр конфигурации становится доступным для каждой детали вашего сайта. Таким образом, у вас есть возможность переопределить любые параметры, заданные модулями.

Возможно, вы видели "объединенный" файл конфигурации при установке PHP, где есть главный файл php.ini и несколько дополнительных файлов конфигурации, включенных в него. Такое разделение делает настройку вашего приложения многогранной и гибкой, потому что вам не нужно помещать все ваши параметры в один файл и изменять его каждый раз, когда необходимо внести какие-то изменения.

Файлы конфигурации загружаются в следующем порядке:


Top