Создание модуля
Для разработки модуля, необходимо базово ознакомится со структурой каждого модуля. Каждый модуль должен иметь уникальный ключ.
Ключом модуля выступает название папки и параметр "key"
в module.json
Создание модуля
Чтобы создать базовую структуру модуля, достаточно ввести данную команду:
php flute generate:module
После выполнения данной команды будет создана базовая структура модуля со всеми необходимыми директориями.
ServiceProvider
В каждом модуле должны быть ServiceProvider'ы. Эти классы обознают загрузку определенных компонентов в систему. Примеры возможностей ServiceProvider'ов:
- Подгрузка параметров маршрутизации в движок (роутов)
- Подгрузка переводов из модуля в движок
- Подгрузка кастомных пунктов в админ-панель
- И т.п.
Как Вы уже поняли, возможности сервис провайдеров неограничены, но служат они только для инициализации.
Пример реализации сервис провайдера модуля:
<?php
namespace Flute\Modules\Monitoring\ServiceProviders;
use Flute\Core\Support\ModuleServiceProvider;
class MonitoringServiceProvider extends ModuleServiceProvider
{
public function boot(\DI\Container $container): void
{
// Подгружаем переводы модуля
$this->loadTranslations('Monitoring');
}
public function register(\DI\Container $container): void
{
}
}
В каждом ServiceProvider'е должно быть 2 метода:
- boot - Запускается только тогда, когда модуль активен в системе.
- register - Запускается независимо от статуса модуля (включен / выключен)
Важное примечание! ServiceProvider не будет вызываться, если модуль не установлен
Extensions
В каждом ServiceProvider могут быть так называемые расширения (Extensions). Это дополнения к ServiceProvider'у, которые позволяют декомпозировать логику провайдера не некоторые компоненты. Пример:
- Расширение расширения шаблонизатора
- Расширение инициализации роутов
- и т.п.
На самом деле, ServiceProvider'ы могут спокойно прожить и без расширений. Но расширения позволяют разбить некоторые части кода, что влечет повышение читабельности Вашего проекта.
Пример реализации расширения:
<?php
namespace Flute\Modules\Monitoring\ServiceProviders\Extensions;
use Flute\Modules\Monitoring\Widgets\ServersWidget;
class WidgetExtension implements \Flute\Core\Contracts\ModuleExtensionInterface
{
public function register() : void
{
// В этом расширении, мы регистрируем новый виджет в систему
widgets()->register(new ServersWidget());
}
}
Каждое расширение обязано имплементировать интерфейс ModuleExtensionInterface
и содержать в себе метод register()
Чтобы инициализировать наше расширение в ServiceProvider, нам нужно добавить его в массив $extensions
внутри нашего ServiceProvider'а:
<?php
namespace Flute\Modules\Monitoring\ServiceProviders;
use Flute\Modules\Monitoring\ServiceProviders\Extensions\WidgetExtension;
class MonitoringServiceProvider extends ModuleServiceProvider
{
public array $extensions = [
WidgetExtension::class, // Мы добавляем наше расширение сюда
];
/** Остальная логика */
}
Работа с БД
Для работы модулей могут потребоваться дополнительные таблицы (или расширение уже существующих таблиц). Для этого используются сущности библиотеки Cycle ORM
Сущности
Каждая сущность должна иметь уникальное название. Все сущности должны находится в папке databases/Entities
и начинаться с заглавной буквы.
Примеры реализации сущностей можете посмотреть в app/Core/Database/Entities
.
Для того, чтобы наши сущности создавали таблицы в БД, нам нужно выполнять миграции.