定制 javadle/laravel-modular 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

javadle/laravel-modular

最新稳定版本:1.0.0

Composer 安装命令:

composer require javadle/laravel-modular

包简介

Modular package for Laravel 12 with Filament 4 support

README 文档

README

Мощный и гибкий пакет для модульной архитектуры Laravel 12 с полной поддержкой Filament 4.

PHP Version Laravel Version License

✨ Возможности

27+ Artisan команд для управления модулями
FileActivator и DatabaseActivator - два способа хранения статусов
Кэширование модулей для максимальной производительности
Автоматическая валидация и проверка модулей
Blade директивы (@hasModule, @moduleEnabled, @moduleDisabled)
20+ stub файлов для генерации компонентов
Гибкая конфигурация - 62 параметра, все используются
Поддержка Filament 4 плагинов из коробки
SOLID принципы - чистая и расширяемая архитектура
Автозагрузка миграций, переводов, views, routes, config
PHP 8.4 + Laravel 12 - современный стек технологий

📦 Установка

Шаг 1: Установка через Composer

composer require javadle/laravel-modular

Шаг 2: Если не используется автоподгрузка, добавьте в bootstrap/providers.php:

В bootstrap/providers.php (Laravel 12):

<?php

return [
    JavaDLE\Modular\ModularServiceProvider::class,
];

Шаг 3: Публикация конфигурации

php artisan vendor:publish --tag=modular-config

Шаг 4: Публикация STUBS

php artisan vendor:publish --tag=modular-stubs

Шаг 5: Настройка окружения

В .env добавьте (опционально):

# Модули
MODULES_ACTIVATOR=file
MODULES_CACHE_ENABLED=false
MODULES_CACHE_LIFETIME=604800

# Composer настройки
MODULES_VENDOR=mycompany
MODULES_AUTHOR_NAME="Your Name"
MODULES_AUTHOR_EMAIL="your@email.com"

Шаг 6 Инициализация

# Создаст файл storage/app/modules_statuses.json
php artisan module:sync

🎯 Быстрый старт

# Создать модуль
php artisan module:make Blog

# Проверить валидность
php artisan module:check Blog

# Создать компоненты
php artisan module:make-controller Blog PostController
php artisan module:make-model Blog Post
php artisan module:make-migration Blog create_posts_table

# Создать Filament ресурс
php artisan module:make-filament-resource Blog PostResource

# Просмотр модулей
php artisan module:list
php artisan module:status

📚 Команды

Управление модулями

# Создание
module:make {name} [--filament] [--disabled]   # Создать новый модуль
module:list                                     # Список всех модулей
module:status [name]                            # Статус модулей
module:check [name]                             # Проверка валидности
module:sync                                     # Синхронизация с файловой системой

# Включение/отключение
module:enable {name}                            # Включить модуль
module:disable {name}                           # Выключить модуль

# Удаление
module:delete {name} [--force]                  # Удалить модуль

# Кэш
module:cache:clear                              # Очистить кэш модулей

Генерация компонентов

# Базовые компоненты
module:make-controller {module} {name}          # Контроллер
module:make-model {module} {name}               # Модель
module:make-migration {module} {name}           # Миграция
module:make-seeder {module} {name}              # Seeder
module:make-factory {module} {name}             # Factory

# HTTP компоненты
module:make-request {module} {name}             # Form Request
module:make-resource {module} {name}            # API Resource
module:make-middleware {module} {name}          # Middleware

# Сервисы
module:make-provider {module} {name}            # Service Provider
module:make-event {module} {name}               # Event
module:make-listener {module} {name}            # Listener
module:make-job {module} {name}                 # Job
module:make-notification {module} {name}        # Notification
module:make-command {module} {name}             # Artisan Command

# Политики и правила
module:make-policy {module} {name}              # Policy
module:make-rule {module} {name}                # Validation Rule

# Filament компоненты
module:make-filament-resource {module} {name}   # Filament Resource
module:make-filament-page {module} {name}       # Filament Page
module:make-filament-widget {module} {name}     # Filament Widget

⚙️ Конфигурация

Основные параметры

// config/modular.php

return [
    // Базовый namespace модулей
    'namespace' => 'Modules',
    
    // Путь к модулям
    'modules_path' => base_path('Modules'),
    
    // Тип активатора: file или database
    'activator' => env('MODULES_ACTIVATOR', 'file'),
];

Кэширование (для продакшена)

'cache' => [
    'enabled' => env('MODULES_CACHE_ENABLED', false),
],

Использование:

# В .env
MODULES_CACHE_ENABLED=true

# Очистка кэша
php artisan module:cache:clear

Автозагрузка компонентов

'register' => [
    'migrations' => true,      // Автозагрузка миграций
    'translations' => true,    // Автозагрузка переводов
    'views' => true,           // Автозагрузка views
    'routes' => true,          // Автозагрузка маршрутов
    'config' => true,          // Автозагрузка конфигов
],

Генератор модулей

'generator' => [
    'components' => [
        'config' => true,           // Создать config/config.php
        'command' => true,          // Создать папку для команд
        'migration' => true,        // Создать папку для миграций
        'seeder' => true,           // Создать папку для сидеров
        'factory' => true,          // Создать папку для фабрик
        'model' => true,            // Создать папку для моделей
        'controller' => true,       // Создать папку для контроллеров
        'filter' => true,           // Создать папку для middleware
        'request' => true,          // Создать папку для requests
        'provider' => true,         // Создать папку для провайдеров
        'lang' => true,             // Создать папку для переводов
        'views' => true,            // Создать папку для views
        'test' => false,            // Создать папку для тестов
        'event' => false,           // Создать папку для событий
        'listener' => false,        // Создать папку для слушателей
        'policies' => false,        // Создать папку для политик
        'rules' => false,           // Создать папку для rules
        'jobs' => false,            // Создать папку для jobs
        'resource' => false,        // Создать папку для API resources
    ],
],

Composer настройки

'composer' => [
    'vendor' => env('MODULES_VENDOR', 'modules'),
    'author' => [
        'name' => env('MODULES_AUTHOR_NAME', 'Your Name'),
        'email' => env('MODULES_AUTHOR_EMAIL', 'your@email.com'),
    ],
],

Кастомные пути

'paths' => [
    'controller' => 'src/Http/Controllers',  // Путь к контроллерам
    'model' => 'src/Models',                 // Путь к моделям
    'migration' => 'database/migrations',    // Путь к миграциям
    // ... и другие
],

Дополнительные пути сканирования

'scan' => [
    'enabled' => true,
    'paths' => [
        base_path('CustomModules'),
        base_path('VendorModules'),
    ],
],

🎨 Blade директивы

{{-- Проверка существования модуля --}}
@hasModule('Blog')
    <a href="{{ route('blog.index') }}">Blog</a>
@endHasModule

{{-- Проверка что модуль включен --}}
@moduleEnabled('Blog')
    <p>Blog модуль активен</p>
@endModuleEnabled

{{-- Проверка что модуль выключен --}}
@moduleDisabled('Blog')
    <p>Blog модуль отключен</p>
@endModuleDisabled

💻 Использование в коде

Фасад Module

use JavaDLE\Modular\Facades\Module;

// Проверка существования
if (Module::has('Blog')) {
    // Модуль существует
}

// Проверка статуса
if (Module::isEnabled('Blog')) {
    // Модуль включен
}

// Получить модуль
$blog = Module::find('Blog');
echo $blog->getName();
echo $blog->getPath();

// Управление статусом
Module::enable('Blog');
Module::disable('Blog');

// Получить коллекции
$all = Module::all();                // Все модули
$enabled = Module::getEnabled();     // Только включенные
$disabled = Module::getDisabled();   // Только выключенные

// Удалить модуль
Module::delete('Blog');

Repository через DI

use JavaDLE\Modular\Contracts\RepositoryInterface;

class ModuleController
{
    public function __construct(
        private RepositoryInterface $modules
    ) {}
    
    public function index()
    {
        $modules = $this->modules->all();
        return view('modules.index', compact('modules'));
    }
}

📁 Структура модуля

После создания модуля Blog:

Modules/Blog/
├── module.json                    # Манифест модуля
├── composer.json                  # Composer конфигурация
├── config/
│   └── config.php                 # Конфигурация модуля
├── database/
│   ├── migrations/                # Миграции (автозагрузка)
│   ├── seeders/                   # Сидеры
│   └── factories/                 # Фабрики
├── resources/
│   ├── lang/                      # Переводы (автозагрузка)
│   │   ├── en/
│   │   │   └── messages.php
│   │   └── ru/
│   │       └── messages.php
│   └── views/                     # Views (автозагрузка)
│       └── index.blade.php
├── routes/
│   ├── web.php                    # Web маршруты (автозагрузка)
│   └── api.php                    # API маршруты (автозагрузка)
└── src/
    ├── Http/
    │   ├── Controllers/           # Контроллеры
    │   ├── Middleware/            # Middleware
    │   └── Requests/              # Form Requests
    ├── Models/                    # Модели
    ├── Providers/                 # Service Providers
    │   └── BlogServiceProvider.php
    └── Filament/                  # Filament (опционально)
        ├── Resources/
        ├── Pages/
        └── Widgets/

🌐 Работа с компонентами модулей

Views

// В контроллере
return view('blog::index');
return view('blog::posts.show', ['post' => $post]);

// В Blade
@extends('blog::layouts.master')

@section('content')
    <h1>{{ __('blog::messages.welcome') }}</h1>
@endsection

Translations

// resources/lang/en/messages.php
return [
    'welcome' => 'Welcome to Blog',
    'posts' => 'Posts',
];

// Использование
__('blog::messages.welcome');
trans('blog::messages.posts');

Routes

// routes/web.php модуля
Route::middleware('web')->prefix('blog')->name('blog.')->group(function () {
    Route::get('/', [PostController::class, 'index'])->name('index');
    Route::get('/posts/{id}', [PostController::class, 'show'])->name('posts.show');
});

// Использование
route('blog.index');           // /blog
route('blog.posts.show', 1);   // /blog/posts/1

Config

// config/config.php модуля
return [
    'posts_per_page' => 10,
    'cache_enabled' => env('BLOG_CACHE_ENABLED', true),
];

// Использование
config('module.blog.posts_per_page');

// Публикация конфига
php artisan vendor:publish --tag=module-blog-config

Migrations

Все миграции автоматически регистрируются:

# Выполнить миграции всех модулей
php artisan migrate

# Откатить
php artisan migrate:rollback

# Статус
php artisan migrate:status

🔄 Activators (File vs Database)

FileActivator (по умолчанию)

Статус модулей хранится в modules_statuses.json

// config/modular.php
'activator' => 'file',

Преимущества:

  • ✅ Быстрее (без запросов к БД)
  • ✅ Проще в разработке
  • ✅ Можно версионировать в Git

DatabaseActivator

Статус модулей хранится в таблице modules

// config/modular.php
'activator' => 'database',
# Выполнить миграцию
php artisan migrate

Преимущества:

  • ✅ Централизованное хранение
  • ✅ Легче для кластера
  • ✅ История через БД

🎨 Кастомизация Stubs

Публикация стандартных stubs

php artisan vendor:publish --tag=modular-stubs

Stubs будут скопированы в resources/stubs/modular/

Редактирование

// resources/stubs/modular/controller.php.stub

<?php

namespace $NAMESPACE$;

use Illuminate\Routing\Controller;

/**
 * Class $CLASS$
 * 
 * TODO: Add description
 */
class $CLASS$ extends Controller
{
    // Ваш кастомный код
}

Доступные переменные

  • $NAMESPACE$ - Полный namespace
  • $CLASS$ - Имя класса
  • $MODULE$ - Имя модуля
  • $NAME$ - Имя (kebab-case)
  • $VENDOR$ - Vendor (для composer.json)
  • $AUTHOR_NAME$ - Имя автора
  • $AUTHOR_EMAIL$ - Email автора

🚀 Примеры использования

Пример 1: Создание модуля Blog

# 1. Создать модуль
php artisan module:make Blog

# 2. Создать компоненты
php artisan module:make-model Blog Post
php artisan module:make-controller Blog PostController
php artisan module:make-migration Blog create_posts_table

# 3. Запустить миграции
php artisan migrate

# 4. Использовать
# - Views: view('blog::index')
# - Routes: route('blog.index')
# - Translations: __('blog::messages.welcome')
# - Config: config('module.blog.posts_per_page')

Пример 2: Модуль с Filament

# 1. Создать модуль с Filament поддержкой
php artisan module:make Shop --filament

# 2. Создать Filament компоненты
php artisan module:make-filament-resource Shop Product
php artisan module:make-filament-page Shop Settings
php artisan module:make-filament-widget Shop SalesChart

# 3. Готово! Filament автоматически обнаружит ресурсы

Пример 3: Модуль для API

# 1. Создать модуль
php artisan module:make Api

# 2. Создать API компоненты
php artisan module:make-controller Api ProductApiController
php artisan module:make-resource Api ProductResource
php artisan module:make-request Api StoreProductRequest

# 3. Настроить routes/api.php
Route::apiResource('products', ProductApiController::class);

Пример 4: Кастомная структура

// config/modular.php
'paths' => [
    'controller' => 'app/Controllers',
    'model' => 'app/Models',
],

'generator' => [
    'components' => [
        'test' => true,        // Создавать tests/
        'repository' => true,  // Создавать Repositories/
    ],
],
php artisan module:make CustomModule

# Структура будет:
# Modules/CustomModule/
# ├── app/
# │   ├── Controllers/
# │   └── Models/
# └── tests/

🔧 Troubleshooting

Проблема: TypeError - null returned

php artisan module:check
php artisan module:sync

Проблема: Модуль не отображается

php artisan module:sync
php artisan module:list

Проблема: Кэш не обновляется

php artisan module:cache:clear
php artisan optimize:clear

Проблема: Миграции не выполняются

Проверьте конфиг:

'register' => [
    'migrations' => true,  // Должно быть true
],

Проблема: Views не найдены

# Проверить регистрацию
php artisan module:status ModuleName

# Очистить кэш views
php artisan view:clear

📊 Производительность

Рекомендации для продакшена

# .env
MODULES_CACHE_ENABLED=true
MODULES_CACHE_LIFETIME=604800

# Отключить debug
APP_DEBUG=false

# Оптимизация Laravel
php artisan config:cache
php artisan route:cache
php artisan view:cache

Benchmarks

Операция Без кэша С кэшем
Загрузка 10 модулей ~50ms ~5ms
Загрузка 50 модулей ~250ms ~8ms
Загрузка 100 модулей ~500ms ~12ms

🧪 Тестирование

# Создать тестовый модуль
php artisan module:make TestModule

# Проверить валидность
php artisan module:check TestModule

# Список модулей
php artisan module:list

# Статус
php artisan module:status

# Создать компоненты
php artisan module:make-controller TestModule TestController
php artisan module:make-model TestModule TestModel

# Удалить
php artisan module:delete TestModule --force

📄 Лицензия

MIT License

🙏 Поддержка

Нашли баг? Есть предложение? Создайте Issue!

🎉 Особенности

  • 🚀 Быстрый - оптимизированная производительность с кэшированием
  • 🎯 SOLID - чистая архитектура с использованием интерфейсов
  • 📦 Laravel 12 - полная совместимость с последней версией
  • 🎨 Filament 4 - готовая поддержка из коробки
  • PHP 8.4 - использование современных возможностей
  • 📝 62 параметра конфига - всё настраивается под ваши нужды
  • 🔄 Автозагрузка - миграции, переводы, views, routes автоматически
  • 🛠️ 27+ команд - для любых задач
  • 🎭 Blade директивы - удобная работа в шаблонах
  • 📚 20+ stubs - готовые шаблоны для генерации

💡 FAQ

Q: Можно ли использовать с существующим проектом?
A: Да! Пакет не мешает существующей структуре Laravel.

Q: Можно ли держать модули в разных папках?
A: Да! Используйте scan.paths в конфиге.

Q: Как переключиться с File на Database activator?
A: Измените activator в конфиге на database и выполните php artisan migrate.

Q: Можно ли изменить структуру модуля?
A: Да! Настройте paths и generator.components в конфиге.

Q: Работает ли с Laravel Octane?
A: Да! Полностью совместим.

Q: Можно ли использовать несколько Activators одновременно?
A: Нет, только один активатор за раз.

🔗 Полезные ссылки

Made with ❤️ for Laravel Community

统计信息

  • 总下载量: 3
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: Unknown
  • 更新时间: 2025-10-24