xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

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

Реализация для 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
Похожие записи

Комментарии RSS

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

наоборот

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

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

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

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

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

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании