В D7 при разработке модулей, все функции которые были размещены в modules/my_module1, были доступны в modules/my_module2.
При обновлении до D10, такого не происходит. Теперь нужно много переписывать по правилам D10+.
Тем не менее, набор модулей для работы нашей системы, взаимодействует между собой, используя только функции наших модулей.
Некоторые функции конечно от drupal используется, но это ограниченное количество, в основном для получения и синхронизации данных пользователей, в зависимости от ролей при входе в систему и доступу к данным.
Возникают следующие вопросы, на которые есть только поверхностная информация в Интернет:
1. про modules/mymodul1/src/controller много всего написано, а вот про другие каталоги в папке /src практически ни чего.
Может кто ни будь, сделать расширенное описание, с уровнями доступа, стандартными названиями каталогов в custom модулях?
2. Может кто ни будь пробовал написать вариант кода, который объединит несколько модулей без пространства имен? Например, функции my_module1, my_module2, my_module3 доступны друг другу как в D7
- Блог
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Комментарии
Называйте каталоги по смыслу. Вот скажем вы хотите подписаться на события связанные с роутами, пусть будет это "RouteSubscriberBase". Структуру файлов/каталогов можно сделать такую
my_module1/src/EventSubscriber/RouteSubscriber.phpDrupal это подхватит без проблем, вы же все равно будите указывать новый сервис "RouteSubscribe" в файле my_module1.services.yml
Если вы создаете/переопределяете плагин, то создайте папку Plugin. Внутри этой папки уже создавайте папки, в зависимости от того, что делаете. Если это плагин связанный с полями, то создайте подпапку "Field"
my_module1/src/Plugin/Field/*
Так же всегда можно посмотреть в ядро друпала, его стандартные модули. Там множество подсказок по организации структур папок в модуле.
Вариант No 1: Используйте сервисы. Сервис это просто класс в папке
my_module1/src/Service/class_name.phpВы можете перенести все ваши функции из модуля D7 в сервисы. Потом в любом модуле или теме вызывайте их вот так:
<?php$result= \Drupal::service('my_module1.your_name_service')->myFunction();
?>
Вариант No 2(менее предпочтительный): Старый добрый include_once. Вам ни кто не мешает его использовать. В вашем модуле в файле "my_module1.module" можете подключить через include_once все ваши функции, которые использовались в D7. Тут главное следить, что бы не конфликтовали имена подключаемых функций.
Спасибо за ответ!
Ноя, немного про другое!
Обратил внимание на то что, если 2 файла находятся в папке modules/custom/my_module/
то функции не доступны между этими двумя файлами, и пространство имён у них одинаковое -Drupal\my_module.
Стоит переместить их в папку modules/custom/my_module/src/, функции становятся доступны.
Ло ломаются функции которые привязаны каталогу модуля.
Я вот про такие нюансы спрашиваю!
Например как повлияет на доступность функций, если файлы разместить в каталоге my_module/src/Plugin/
Я ещё очень плохо понимаю php, Drupal 10, но пока не нашел решения восстановить переменную, если переместить файл в каталог /src/
Вопрос в том, что работа других 2-х модулей в группе, зависит от этого файла ф первом модуле.
В общем, на конкретные вопросы ответа не получил пока, буду пробовать найти решение с помощью Symfony.
Допустим ваши два файла называются test_file_1.php и test_file_2.php, тогда в файле modules/custom/my_module/my_module.module вы можете их подключить через include_once вот так
include_once 'test_file_1.php';
include_once 'test_file_2.php';
Функции из этих двух файлов будут доступны везде.
Из этой папки друпал автоматом подключает файлы. Создайте файл в котором опишите класс, скажем файл называется ImageEditor.php, полный путь к файлу будет таким: modules/custom/my_module/src/ImageEditor.php.
namespace Drupal\my_module;
class ImageEditor{
/**
* Ваша функция
*
*/
public function myFunction()
{
return 'Отдаем результат';
}
}
Пример, как этот класс использовать в коде, скажем в контроллере:
<?php
namespace Drupal\my_module\Controller;use
Drupal\Core\Controller\ControllerBase;use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
// Говорим, что будем использовать наш класс
use Drupal\my_module\ImageEditor;
class
Editor extends ControllerBase{public function
editorPage(){
$imageEditor = new ImageEditor();
$result= $imageEditor ->myFunction();
}
} ?>
Сорри за оформление кода, ни как не смог поправить в редакторе на сайте
Спасибо!
С подсвечиванием функций в одном модуле становится понятным, так можно и без объявления пространства имён в файлах внутри модуля обойтись. Я верно понял?
То есть, вызывая:
$result= $imageEditor ->myFunction();
myFunction() может быть любая в my_module_1\ ?
Так же, можно вызывать в my_module_2\ ?
Если вы подключаете просто файл с функциями через include_once, то да, можно без пространства имен обойтись. Тут главное следить, что бы названия функций не совпадали с уже используемыми. Если такое произойдет, php выдаст ошибку. Для пример вы создаете функцию и называете ее dump. В таком случае php выдаст ошибку, так как такая функция уже объявлена в ядре друпала.
Если вы подключаете файлы, в которых объявлен класс, то хорошо бы использовать пространство имен. Это позволяет избежать конфликтов в наименовании функций/классов.
Да, можно вызвать где угодно. Обратите внимание на строку.
<?phpuse Drupal\my_module\ImageEditor;
?>
Если не нравится использовать "use", то можете вот так сделать:
<?php$imageEditor = new \Drupal\my_module\ImageEditor();
$result= $imageEditor ->myFunction();
?>