Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Конфигурация

Конфигурация — настройки сайта и модулей: название сайта, число статей на странице, текст приветствия. 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, форму настроек или переустановку модуля.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.