При разработке сложных проектов вы всегда создаете кастомные модули, которые должны решать ту или иную не стандартную задачу, а чем сложнее проект, тем обширнее становится файловая структура вашего модуля. Например, для себя, еще с 7й версии Drupal, я структуру (иерархию) модуля делил по следующему принципу:
module_name
- src
-- Entity
--- Node
--- Taxonomy
-- Views
--- Views_name
-- Helper
--- Entity
---- HelperNode
---- HelperTaxonomy
--- Views
---- HelperViews
--- Custom
- module_name.info
- module_name.module
Данная структура (паттерн) не является идеальной, но меня устраивала в большей его части, в силу того, что все было разбито по категориям, например хуки для нод, находились в файле по пути:
module_name/src/Entity/Node
а для не стандартных функций, использовал класс по шаблону:
nameHelper.php
который находился по пути
module_name/src/Helper/entity_name/nameClass
так, например дополнительные методы для views находились в классе
HelperViews
который находился по пути
module_name/src/Helper/Views/HelperViews
соответственно, файл
module_name.module
использовался только для подключения данных файлов, через
module_load_include()
и в данном файле уже никакой реализации хуков или дополнительных функций не было.
С приходом Drupal 8, естественно пришлось изменять своим привычкам и делать то, что говорит теперь движок, а именно всю разработку производить по стандартам PSR-4, но который все больше меня радует.
Итак, как вы могли понять из текста выше, использование кастомных классов в 7ке реализовывалось отдельным подключением файла класса в структуру модуля.
В Drupal 8 этим дела обстоят гораздо лучше, как всегда разберем на примере, мой модуль называется custom_ex.
Файл custom_ex.info.yml
name: Custom ex
description: Данный модуль демонстрирует использование кастомных классов внутри модуля
core: 8.x
package: Drupalfly
type: module
Далее я в директории src создам дополнительную директорию, которая будет содержать наш класс, в моем случае имя директории будет Helper, внутри которой создам наш класс
<?php
namespace Drupal\custom_ex\Helper;
# Class Helper
class customExHelper{
# Get text
public function getText(){
$output = 'Destroy for creation';
return $output;
}
}
Хочу заметить, что в именовании класса обязательно первым указывать Drupal, иначе класс у вас не подцепится.
Теперь осталось это дело проверить, я использую hook_preprocess_page()
Файл custom_ex.module
<?php
use Drupal\custom_ex\Helper;
/**
* @param $variables
* Implements hook_preprocess_page()
*/
function custom_ex_preprocess_page(&$variables){
$customExHelper = new Helper\customExHelper();
$text = $customExHelper->getText();
debug($text);
}
И результат на экране
Как вы можете заметить никаких дополнительных include() мы не использовали, система автоматически все сделала за нас, исходя из наименования класса. На этом можно закончить.
Скачать модуль, используемый в примере: