メインコンテンツまでスキップ

モジュール

スーパー管理者 → モジュール では、LeadHub インストール環境に登録されているカスタムモジュールのステータスを確認できます。

LeadHub には組み込みの機能モジュールは搭載されていません — モジュールシステムは開発者向けの拡張ポイントであり、コアコードベースに手を加えることなくプラットフォームへ新しい機能を追加することができます。


モジュールシステムとは何ですか?

LeadHub は nWidart/laravel-modules を使用して HMVC(階層型モデル・ビュー・コントローラー) アーキテクチャを実装しています。

HMVC はコードを自己完結型のモジュールに整理します。各モジュールは独自のルート、コントローラー、モデル、ビュー、マイグレーション、サービスプロバイダーを持ち、本質的にメインアプリケーションに読み込まれるミニ Laravel アプリケーションです。これにより以下のことが可能です:

  • コアを編集することなく、まったく新しい機能(新しい UI セクション、新しい API エンドポイント、新しいバックグラウンドジョブ)を追加できます。
  • スーパー管理者パネルから、または modules_statuses.json を通じて、モジュールを実行時に有効・無効にできます。
  • 各モジュールは独立してバージョン管理され、他のモジュールへの依存関係を宣言できます。

インストール(LeadHub に既に含まれています)

パッケージはすでに LeadHub にインストールおよび設定されています。確認するには:

composer show nwidart/laravel-modules

モジュールの設定は config/modules.php にあり、モジュールはプロジェクトルートの Modules/ 以下に保存されています。


最初のモジュールを作成する

# 新しいモジュールのスキャフォールドを作成する
php artisan module:make MyFeature

# 複数のモジュールを一度にスキャフォールドする
php artisan module:make ModuleA ModuleB ModuleC

# デフォルトのボイラープレートファイルなしでスキャフォールドする(最小限)
php artisan module:make MyFeature --plain

module:make を実行すると、モジュールは Modules/MyFeature/ 以下に作成され、自動的に登録されます。


モジュールのボイラープレート構造

Modules/
MyFeature/
app/
Http/
Controllers/ # ルートコントローラー
Middleware/ # モジュールスコープのミドルウェア
Requests/ # フォームリクエストクラス
Models/ # Eloquent モデル
Providers/
MyFeatureServiceProvider.php # メインサービスプロバイダー(自動ロード)
RouteServiceProvider.php # routes/web.php + routes/api.php を読み込む
config/
config.php # モジュールレベルの設定
database/
migrations/ # モジュールのマイグレーション(コアから分離)
seeders/
factories/
resources/
views/ # Blade テンプレート
lang/ # 翻訳文字列
assets/ # JS/CSS(Vite でコンパイル)
routes/
web.php # Web ルート('web' ミドルウェアグループ下で読み込まれる)
api.php # API ルート('api' ミドルウェアグループ下で読み込まれる)
tests/ # フィーチャーテストとユニットテスト
module.json # モジュールのメタデータと依存関係の宣言
composer.json # このモジュールの名前空間の PSR-4 オートローディング

主要ファイルの説明

module.json

モジュールのアイデンティティと読み込み順序を定義します:

{
"name": "MyFeature",
"alias": "myfeature",
"description": "Adds custom feature X to LeadHub",
"keywords": [],
"priority": 0,
"providers": [
"Modules\\MyFeature\\Providers\\MyFeatureServiceProvider"
],
"requires": []
}
  • priority — 読み込み順序を制御します。数値が小さいほど先に読み込まれます。モジュールが他のモジュールに依存する場合に使用してください。
  • requires — このモジュールが依存するモジュールエイリアスのリストです。LeadHub は読み込み前に依存関係を強制します。

MyFeatureServiceProvider.php

モジュールのエントリポイントです。ルート、ミドルウェア、ビュー、翻訳、バインディングをここに登録してください。スキャフォールドされたプロバイダーはすでに RouteServiceProvider を呼び出し、モジュールのビューと翻訳を自動的に登録します。

config/config.php

モジュールレベルの設定です。以下の方法でアクセスできます:

config('myfeature.some_key');

Laravel の標準的な設定パブリッシング機能を使用して、環境ごとにパブリッシュおよびオーバーライドできます。


一般的な Artisan ジェネレーター

# コントローラー、モデル、マイグレーション
php artisan module:make-controller MyController MyFeature
php artisan module:make-model MyModel MyFeature
php artisan module:make-migration create_my_table MyFeature

# リクエスト、ミドルウェア、ポリシー
php artisan module:make-request StoreMyRequest MyFeature
php artisan module:make-middleware CheckSomething MyFeature
php artisan module:make-policy MyPolicy MyFeature

# ジョブ、イベント、リスナー、メール
php artisan module:make-job ProcessSomething MyFeature
php artisan module:make-event SomethingHappened MyFeature
php artisan module:make-listener HandleSomething MyFeature
php artisan module:make-mail WelcomeMail MyFeature

# Artisan コマンド
php artisan module:make-command MyCommand MyFeature

マイグレーションとシードの実行

モジュールのマイグレーションはコアとは別に管理されています。独立して実行してください:

# すべてのモジュールをマイグレートする
php artisan module:migrate

# 特定のモジュールをマイグレートする
php artisan module:migrate MyFeature

# ロールバック
php artisan module:migrate-rollback MyFeature

# シード
php artisan module:seed MyFeature

モジュールの有効化と無効化

コマンドラインから:

php artisan module:enable MyFeature
php artisan module:disable MyFeature
php artisan module:list # すべてのモジュールとそのステータスを表示する

スーパー管理者 → モジュール から:登録された各モジュールの横にあるトグルを使用してください。

モジュールのステータスはプロジェクトルートの modules_statuses.json に保存されます — このファイルはバージョン管理にコミットしてください


マルチテナントに関する考慮事項

LeadHub はマルチテナントです。モジュールを構築する際は以下の点に注意してください:

  • テナントスコープのマイグレーション:マイグレーションがテナントレベルのテーブルを作成する場合は、テナントコンテキスト内で module:migrate をラップしてください。
  • サービスプロバイダーの分離:グローバルスコープを汚染しないよう、ミドルウェア、ポリシー、イベントリスナーをモジュールのサービスプロバイダー内に登録してください。
  • 機能のゲーティング:モジュールの有効/無効トグルを LeadHub のプランシステムと組み合わせて使用してください — モジュールをグローバルに無効化するか、特定のプランティアに制限できます。

関連情報