アプリケーションプラグイン

各アプリケーションプラグインは完全なアプリケーションであり、ソースコードは{メインプロジェクト}/pluginディレクトリに配置されます。

ヒント
コマンドphp webman app-plugin:create {プラグイン名}を使用すると、ローカルでアプリケーションプラグインを作成できます。
例えば、php webman app-plugin:create cmsは以下のディレクトリ構造を作成します。

plugin/
└── cms
    ├── app
    │   ├── controller
    │   │   └── IndexController.php
    │   ├── exception
    │   │   └── Handler.php
    │   ├── functions.php
    │   ├── middleware
    │   ├── model
    │   └── view
    │       └── index
    │           └── index.html
    ├── config
    │   ├── app.php
    │   ├── autoload.php
    │   ├── container.php
    │   ├── database.php
    │   ├── exception.php
    │   ├── log.php
    │   ├── middleware.php
    │   ├── process.php
    │   ├── redis.php
    │   ├── route.php
    │   ├── static.php
    │   ├── thinkorm.php
    │   ├── translation.php
    │   └── view.php
    └── public

アプリケーションプラグインはwebmanと同じディレクトリ構造と設定ファイルを持っています。実際には、アプリケーションプラグインの開発はwebmanプロジェクトの開発とほぼ同じ体験を提供しますが、以下の点に注意が必要です。

名前空間

プラグインのディレクトリと命名はPSR4規範に従っています。プラグインはすべてpluginディレクトリに配置されるため、名前空間はpluginで始まります。例えばplugin\cms\app\controller\UserControllerでは、cmsがプラグインのソースコードの主ディレクトリです。

URLアクセス

アプリケーションプラグインのURLパスはすべて/appで始まります。例えばplugin\cms\app\controller\UserControllerのURLはhttp://127.0.0.1:8787/app/cms/userです。

静的ファイル

静的ファイルはplugin/{プラグイン}/publicに配置されます。例えば、http://127.0.0.1:8787/app/cms/avatar.pngにアクセスすると、実際にはplugin/cms/public/avatar.pngファイルを取得します。

設定ファイル

プラグインの設定は通常のwebmanプロジェクトと同じですが、プラグインの設定は一般的にそのプラグインのみに有効で、メインプロジェクトには影響しません。
例えば、plugin.cms.app.controller_suffixの値はプラグインのコントローラサフィックスにのみ影響し、メインプロジェクトには影響しません。
例えば、plugin.cms.app.controller_reuseの値はプラグインがコントローラを再利用するかどうかにのみ影響し、メインプロジェクトには影響しません。
例えば、plugin.cms.middlewareの値はプラグインのミドルウェアにのみ影響し、メインプロジェクトには影響しません。
例えば、plugin.cms.viewの値はプラグインが使用するビューにのみ影響し、メインプロジェクトには影響しません。
例えば、plugin.cms.containerの値はプラグインが使用するコンテナにのみ影響し、メインプロジェクトには影響しません。
例えば、plugin.cms.exceptionの値はプラグインの例外処理クラスにのみ影響し、メインプロジェクトには影響しません。

しかし、ルーティングはグローバルであるため、プラグイン設定のルーティングは全体に影響します。

設定の取得

特定のプラグインの設定を取得する方法はconfig('plugin.{プラグイン}.{具体的な設定}');です。例えば、plugin/cms/config/app.phpのすべての設定を取得する方法はconfig('plugin.cms.app')です。
同様に、メインプロジェクトや他のプラグインもconfig('plugin.cms.xxx')を使用してcmsプラグインの設定を取得できます。

サポートしていない設定

アプリケーションプラグインはserver.php、session.phpの設定をサポートしていません。app.request_classapp.public_pathapp.runtime_pathの設定はサポートされていません。

データベース

プラグインは独自のデータベースを設定できます。例えば、plugin/cms/config/database.phpの内容は以下のようになります。

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysqlは接続名
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'データベース',
            'username'    => 'ユーザー名',
            'password'    => 'パスワード',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // adminは接続名
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'データベース',
            'username'    => 'ユーザー名',
            'password'    => 'パスワード',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

引用方法はDb::connection('plugin.{プラグイン}.{接続名}');です。例えば、

use support\Db;
Db::connection('plugin.cms.mysql')->table('user')->first();
Db::connection('plugin.cms.admin')->table('admin')->first();

メインプロジェクトのデータベースを使用する場合は、そのまま使用できます。例えば、

use support\Db;
Db::table('user')->first();
// メインプロジェクトにadmin接続が設定されていると仮定
Db::connection('admin')->table('admin')->first();

ヒント
thinkormも同様の使い方をします。

Redis

Redisの使用法はデータベースと似ています。例えば、plugin/cms/config/redis.phpは以下のようになります。

return [
    'default' => [
        'host' => '127.0.0.1',
        'password' => null,
        'port' => 6379,
        'database' => 0,
    ],
    'cache' => [
        'host' => '127.0.0.1',
        'password' => null,
        'port' => 6379,
        'database' => 1,
    ],
];

使用方法は以下の通りです。

use support\Redis;
Redis::connection('plugin.cms.default')->get('key');
Redis::connection('plugin.cms.cache')->get('key');

同様に、メインプロジェクトのRedis設定を再利用したい場合は以下のようにします。

use support\Redis;
Redis::get('key');
// メインプロジェクトにcache接続が設定されていると仮定
Redis::connection('cache')->get('key');

ログ

ログクラスの使用法もデータベースの使用法と似ています。

use support\Log;
Log::channel('plugin.admin.default')->info('test');

メインプロジェクトのログ設定を再利用したい場合は、そのまま使用します。

use support\Log;
Log::info('ログ内容');
// メインプロジェクトにtestログ設定があると仮定
Log::channel('test')->info('ログ内容');

アプリケーションプラグインのインストールとアンインストール

アプリケーションプラグインをインストールするには、プラグインディレクトリを{メインプロジェクト}/pluginディレクトリにコピーするだけで、reloadまたはrestartが必要です。
アンインストールする場合は、{メインプロジェクト}/plugin下の対応するプラグインディレクトリを削除するだけです。