Drupal → Вынос служебных функций модуля в отдельный класс

26.12.2013

В друпале негласно принято держать служебные функции модуля в файле modulename.module и добавлять именам функций префикс _, например _node_types_build(). Некоторые модули выносят функции в .inc файл и перед вызовом дёргают module_load_include(). Мне всегда не нравился такой подход, куда приятней хранить все системные функции в отдельном статическом классе. Приятным бонусом является автозагрузка классов, т.е. не надо вручную инклудить файл.

Реализация для Drupal 7

1. Создаём в папке модуля файл modulename_helper.inc.

2. Реализуем в созданном файле класс modulename_helper с набором статических функций:

class modulename_helper {
  public static function my_function() {
    // ...
  }
  public static function my_other_function() {
    // ...
  }
}

3. Добавляем в .info файл модуля строчку:

files[] = modulename_helper.inc

4. Сбрасываем кэш.

5. В любом месте кода пользуемся функциями modulename_helper::my_function() и modulename_helper::my_other_function().

Реализация для Drupal 8+

1. Создаём файл ModulenameHelper.php в папке src вашего модуля (т.е. modules/modulename/src/ModulenameHelper.php относительно корня друпала).

2. Реализуем в созданном файле класс ModulenameHelper с набором статических функций:

namespace Drupal\modulename;

class ModulenameHelper {
  public static function myFunction() {
    // ...
  }
  public static function myOtherFunction() {
    // ...
  }
}

3. Сбрасываем кэш.

4. В любом месте кода пользуемся функциями ModulenameHelper::myFunction() и ModulenameHelper::myOtherFunction(). Перед использованием не забываем добавить в начало файла строчку use Drupal\modulename\ModulenameHelper;

Так же в Drupal 8 можно хранить служебные функции в приватных методах контроллеров, форм, плагинов и т.д., таким образом отдельный класс-хелпер возможно и не понадобится.

Написанное актуально для
Drupal 7, Drupal 8+
Похожие записи

Комментарии

Сори, этот метод не будет излишне загружать оперативную память?

Это называется Utility pattern.

module_load_include, кстати обычно не нужен. Если подключаемый файл находится в том же модуле, то вполне можно обойтись require/include.

Андрей
26.12.2013, 18:46

module_load_include, кстати обычно не нужен. Если подключаемый файл находится в том же модуле, то вполне можно обойтись require/include.

Не верный подход. Поскольку ф-я module_load_include сама использует require_once и делает это с некоторой проверкой (смотри тело ф-и). Да и не Drupal way это.

ф-я module_load_include сама использует require_once и делает это с некоторой проверкой

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

Если с собственно написанными классами все понятно, то что делать уже с готовыми?
Как в Drupal8 правильно подключить тот же самый phpQuery:
или в реализации одного файла phpQuery-onefile.php
или файл phpQuery.php и каталог phpQuery

я как-то интересовался этим вопросом и тогда ничего простого не было, хотя и сейчас вроде конкретики нет. варианты:
* libraries api
* сделать класс сервисом
* добавить класс в автозагрузку
* https://www.drupal.org/project/composer_manager

issues:
* Allow additional external libraries with composer
* Allow a user-editable composer.json file in Drupal's root directory to manage (custom) dependencies

Иногда не могу понять.. как использовать классы или сервисы.. и какой звать...
Как вообще в документации теперь искать необходимое?? раньше нашел функцию и пользуй.. а теперь нашел функцию и фиг поймешь что надо сделать чтоб она сработала :(

Может какие пояснения дашь?

А как сейчас актуально и правильно хранить служебные функции кастомного модуля для drupal 9? По прежнему в хелпере или в своем контроллере? И почему именно статический класс? Плохо понимаю ООП но если на пальцах?

Правильно - использовать для этого сервис, но и статический класс можно, если никто не увидит. Почему статический - не нужно создавать экземпляр класса.

Семён
27.01.2022, 15:43

Плохо, что для тем не прокатывает :(

Прокатывает, почему нет то https://git.drupalcode.org/project/bootstrap/-/tree/8.x-4.x/src

Добавить комментарий