このプラグインシステムは、アプリケーションの機能を動的に拡張するためのフレームワークを提供します。
すべてのプラグインは PluginInterface
を実装する必要があります:
interface PluginInterface
{
public function register(): void; // サービスの登録
public function boot(): void; // ルートやビューの起動
public function unregister(): void; // サービスの登録解除
}
サービスの登録は、下記の手順で行います。
// 既存のサービスを削除
app()->forgetInstance(PlanInterface::class);
app()->offsetUnset(PlanInterface::class);
// 新しいサービスを登録
app()->bind(PlanInterface::class, ExtendedPlanService::class);
ルートやビューの起動は、下記の手順で行います。
// プラグイン名をプレフィックスにしたルートグループを作成
Route::middleware('web')
->prefix('/extendedPlan')
->name('extendedPlan.')
->group(__DIR__ . '/routes/web.php');
// ビューの読み込み
view()->addNamespace('extendedPlan', __DIR__ . '/views');
サービスの登録解除は、下記の手順で行います。
// 新しいサービスを削除
app()->forgetInstance(PlanInterface::class);
app()->offsetUnset(PlanInterface::class);
// 既存のサービスに戻す
app()->bind(PlanInterface::class, SimplePlanService::class);
// ルートやビューの登録を解除
$router = app('router');
$routes = $router->getRoutes();
$newRouteCollection = new \Illuminate\Routing\RouteCollection();
foreach ($routes->getRoutes() as $route) {
if (!str_starts_with($route->uri(), 'extendedPlan')) {
$newRouteCollection->add($route);
}
}
$router->setRoutes($newRouteCollection);
$viewFactory = app('view');
app()->forgetInstance('view');
app()->instance('view', $viewFactory->getFinder()->flush());
プラグイン内で共通して使用するメソッドをまとめたトレイトです。 register, boot, unregister で下記のように使用します。
use PluginHelper;
const NS = 'extendedPlan';
public function register(): void
{
$this->registerService(PlanInterface::class, ExtendedPlanService::class);
Log::debug('ExtendedPlan registered');
}
public function boot(): void
{
$this->registerRoute(self::NS, self::NS, __DIR__ . '/routes/web.php');
$this->registerView(self::NS, __DIR__ . '/views');
Log::debug('ExtendedPlan booted');
}
public function unregister(): void
{
$this->unregisterRouteAndView(self::NS);
$this->registerService(PlanInterface::class, SimplePlanService::class);
Log::debug('ExtendedPlan unregistered');
}
loadPlugins()
メソッド:
config/plugins.php
のplugins
に記載されたプラグインを検索- プラグインクラスをインスタンス化
- アクティブなプラグインのみを読み込み
installPlugin()
メソッド:
- プラグインの登録
- マイグレーションの実行
- サービスの登録
- ルートとビューの読み込み
uninstallPlugin()
メソッド:
- サービスの登録解除
- マイグレーションのロールバック
- プラグインの非アクティブ化
changeVersion()
メソッド:
- マイグレーションの実行
- 旧バージョンのサービスを削除
- 旧バージョンのルートとビューを削除
- 新バージョンのサービスを登録
- 新バージョンのルートとビューを読み込み
changeVersion()
メソッド:
- マイグレーションのロールバック
- 新バージョンのサービスを削除
- 新バージョンのルートとビューを削除
- 旧バージョンのサービスを登録 (現状のファイルシステムに戻す)
- 旧バージョンのルートとビューを読み込み (現状のファイルシステムに戻す)
app()->bind(PlanInterface::class, ExtendedPlanService::class);
このコードにより、既存のサービスが新しいプラグインのサービスで上書きされます。
- プラグインディレクトリ内の
migrations
フォルダに配置 PluginManager
が自動的に検出して実行- ロールバック機能も提供
- プラグイン固有の名前空間でビューを登録
- プレフィックス付きのルートグループを使用
- 例:
extendedPlan::index
でビューにアクセス
-
プラグインのインストール
- データベースにプラグイン情報を登録
- マイグレーションを実行
-
プラグインの起動
- サービスの登録(register)
- ルートとビューの読み込み(boot)
-
プラグインの使用
- 依存性注入によるサービスの利用
- 名前空間付きビューの表示
- プレフィックス付きルートへのアクセス
-
プラグインの無効化
- サービスの登録解除
- マイグレーションのロールバック
- プラグイン情報の更新
- プラグインの命名規則を厳守すること
- マイグレーションは必ずロールバック可能な形で作成すること
- サービスの上書き時は既存機能への影響を考慮すること
各プラグインのルートディレクトリに config.php
を配置する必要があります:
return [
'namespace' => 'ExtendedPlan', // 省略可能
'version' => '1.0.0', // 省略可能
'psr4' => [ // 必須
'ExtendedPlan\\' => __DIR__ . '/app'
],
'basePath' => __DIR__, // 省略可能
'migrations' => __DIR__ . '/migrations', // 省略可能
];
namespace
: プラグインの名前空間を定義(Default:プラグイン名)version
: プラグインのバージョンを指定(バージョン管理に使用)psr4
: オートローディングの設定basePath
: プラグインのルートディレクトリ(Default:config.phpの位置)migrations
: マイグレーションファイルの格納場所(マイグレーションがある場合には必須)
プラグインの管理に使用できる Artisanコマンド:
# マイグレーションの実行
php artisan plugin:migrate {plugin?} {--force} {--path=} {--plugin-version=}
# マイグレーションのロールバック
php artisan plugin:migrate:rollback {plugin?} {--force} {--path=} {--plugin-version=}
# マイグレーションの状態確認
php artisan plugin:migrate:status {plugin?}
# プラグインのバージョン変更
php artisan plugin:version {plugin} {version} {--force}
{plugin}
: 対象プラグインの名前{version}
: 変更先のバージョン--force
: 確認メッセージをスキップ--path
: カスタムマイグレーションパスを指定--plugin-version
: マイグレーション実行時のバージョンを指定
# ExtendedPlanプラグインを2.0.0にアップグレード
php artisan plugin:version ExtendedPlan 2.0.0 --force
# 特定プラグインのマイグレーション実行
php artisan plugin:migrate ExtendedPlan --force
# マイグレーションのロールバック
php artisan plugin:migrate:rollback ExtendedPlan --force