Конфигурация
Конфигурация — настройки сайта и модулей: название сайта, число статей на странице, текст приветствия. Drupal хранит их в базе, но умеет выгружать в файлы YAML и переносить между сайтами вместе с кодом. Настройки своего модуля тоже хранят в конфигурации, а не в константах PHP.
Значения по умолчанию
При включении модуля Drupal читает файлы из папки config/install и записывает их в базу. Создайте папки и файл вручную:
# web/modules/custom/blog/config/install/blog.settings.yml
list_title: 'Свежие статьи'
items_per_page: 10
words_per_minute: 200Имя файла без .yml — имя объекта конфигурации: blog.settings. Его принято начинать с имени модуля.
Схема
Схема описывает тип каждого значения. Drupal проверяет по ней настройки и узнаёт, какие строки можно переводить:
# web/modules/custom/blog/config/schema/blog.schema.yml
blog.settings:
type: config_object
label: 'Настройки блога'
mapping:
list_title:
type: label
label: 'Заголовок списка'
items_per_page:
type: integer
label: 'Статей на странице'
words_per_minute:
type: integer
label: 'Слов в минуту'Файл схемы один на модуль, в нём описывают все объекты конфигурации. Тип label — короткая переводимая строка, string — непереводимая, boolean — да или нет.
Применение
Папка config/install читается только в момент включения модуля. Модуль blog уже включён, поэтому его нужно включить заново:
vendor/bin/drush pmu blog -y
vendor/bin/drush en blog -yПроверить, что настройки записались, можно командой:
vendor/bin/drush config:get blog.settingsОна напечатает три значения из файла.
Чтение
// web/modules/custom/blog/src/Controller/BlogController.php
public function list(): array
{
$config = $this->config('blog.settings');
return [
'#markup' => $config->get('list_title'),
];
}Страница /blog покажет «Свежие статьи». Метод $this->config() есть в контроллерах и формах. В хуках используют \Drupal::config('blog.settings'), а в сервисах — сервис config.factory, как в уроке о сервисах.
Запись
// в любом месте, например в blog.module
\Drupal::configFactory()
->getEditable('blog.settings')
->set('items_per_page', 20)
->save();Объект из config() только для чтения. Изменяют конфигурацию через getEditable() и обязательно вызывают save(). Из терминала то же делает команда drush config:set blog.settings items_per_page 20.
Конфигурация и состояние
Не всё, что нужно запомнить, — конфигурация.
| Хранилище | Что хранить | Переносится между сайтами |
|---|---|---|
| Конфигурация | Настройки, которые задаёт администратор | Да |
| Состояние | Служебные значения: время последней рассылки | Нет |
| Содержимое | Материалы, пользователи | Нет |
Состояние читают и пишут так:
// в любом месте, например в blog.module
\Drupal::state()->set('blog.last_mailing', time());
$last = \Drupal::state()->get('blog.last_mailing', 0);Второй аргумент get() — значение, если ничего ещё не записано.
Частая ошибка
Вы изменили config/install/blog.settings.yml, очистили кеш — а сайт возвращает старые значения. Файлы из config/install — только начальные значения: после включения модуля настоящие настройки живут в базе, и drush cr их не трогает. Меняйте значение через drush config:set, форму настроек или переустановку модуля.