Closed aminotsukasa closed 9 years ago
@aminotsukasa
config.yml
ですが、 PHPの最近のデフォルトである、 composer.json
形式にしてしまってはどうでしょうか。
ライセンス表記やURLなど基本的な内容がまとめられ、これからの時代の一般的な内容になっているかと思います。
Boltの下記のような形が良いかと思います。
https://docs.bolt.cm/extensions/config
{
"name": "foo/bar",
"description": "EC-CUBEのプラグインの説明",
"homepage": "http://www.example.co.jp/bar_plugin/"
"type": "eccube-plugin",
"keywords": ["eccube", "plugin", "foobar"],
"require": {
"eccube/eccube": "~3.0"
},
"authors": [
{
"name": "作者名",
"homepage": "http://www.example.com/"
}
],
"autoload": {
"files": [
"init.php"
],
"psr-4": {
"Eccube\\Plugin\\Foo\\BarPlguin\\": "src"
}
},
}
Eccube\AbstractBackstage
Backstageは新しいNamespaceでしょうか。
Plugin などもう少し直感的にしてはいかがでしょうか。
@ttsuru
config.ymlのフィールド定義に関してはdtb_pluginをとりあえずベースにしましたので、追加で必要なフィールドがあれば追加したほうがいいと思っています。
設定ファイルの書式については、app/config/eccubeの設定ファイルやsrc/Eccube/Resource のDoctrineのリソースがほぼyml形式なのです。 いちいち設定ファイル毎にymlとjsonが混ざるとかえって書きにくいのではないかと思いますがどう思われます?
namespaceは確かにissueの内容だと階層構造が変だと思いますので、 use Eccube\Plugin\AbstractBackstage とかでしょうか。
@aminotsukasa
dtb_plugin
にありそうな内容はほぼ composer.json
で定義できるので、そちらでやってしまってはどうでしょうか。
Wordpressや他のCMS、ECも含め、 composer.json を用意する動きが広がっていて、流れ的にはこのタイミングで変えてしまってはどうでしょうか。
ここはおそらくPHP界全体の流れで、個別にどうこうするよりは右に倣えで対応してしまってはと思います。
それ以外についてはEC-CUBEのプラグインの内容なのでymlでいいと思います。
namespace については Backstage
が意味する内容が直感的にわかりませんでした。
Installなどの基底クラスであれば AbstractPluginManager
などどうでしょうか。
また、今まであった、プラグイン自体の基底クラスはないのでしょうか。
2にあったような基底クラスがあってもよいのではと思いました。
Silexの ServiceProviderInterface
のような形で、 PluginIntrface
などがあるとよいなと思いました。
@ttsuru
composer.json 云々という話は https://github.com/EC-CUBE/ec-cube/issues/242 の続きでしょうか。プラグイン自体の基本的な構造の提案であれば情報が散逸してしますので上記のIssueにコメントしていただけませんか。
Backstageというクラス名はわかりにくいのでAbstractPluginManager に変えようと思います。
Plugin自体の基底クラスはこのIssueでは触れていませんのでまた別Issueに記載します
@aminotsukasa @ttsuru
3からは、プラグインとモジュールを統合し、2.13までのモジュールのオーナーズストアで通信インストールしていた形にインストールを統一したいと思っています。 プラグインマスタテーブル(dtb_pluginに相当)は、オーナーズストアに公開されている内容との整合性をたもつための、2.13までのmtb_moduleに近いものでよいと思います。 特にauthorやplugin_description のような内容はオーナーズストアと通信時に取得するべきかと。 オーナーズストアを使わないインストールの場合に、config.yml やcomposer.jsonを使う形ですかね。
@Yangsin オーナーズストアのレスポンスも composer.json が近いのでこちらでよいのではないでしょうか。 また、現状のオーナーズストアのdistファイルを使った方式よりは、2系のzipなどを解凍するだけのPluginのインストールにダウンロード機能を追加したものの方がよいような気がします。
一部記載に抜けがありましたので追加しています
プラグインのインストーラの仕様を検討してみますた。
こここうしたほうがいいとかあったら指摘くださいませ
概要
プラグインのインストール等の状態変化時の動作とデータ構造を規定する。 また、プラグインのインストール、アンインストールに伴う初期化処理(個別プラグイン用テーブル、初期データ挿入)の実装方法を規定する
データ構造
プラグインマスタテーブル(dtb_pluginに相当)
ハンドラ優先度テーブル(dtb_plugin_hookpointに相当)
※event,priorityの2フィールドでユニークキー
(プラグイン毎の)config.yml
(プラグイン毎の)event.yml
※イベント名のキーに対応するvalueとして、handlerとtypeの二要素からなるハッシュ(ハンドラ定義)の配列が定義される。イベントとハンドラ定義は複数定義できる ※Typeは優先度定義(NORMAL FIRST LASTのいずれかの文字列を設定する) ※内容はgetSubscribedEvents()と同じですがオーナーズストア等でも使えるようymlへ移動
(プラグイン毎の)状態変化ハンドラクラス(プラグインメインクラスに相当) このクラスをプラグインへ同梱すると、各状態変化の際にメソッドがコールされる 処理としてはプラグイン固有のテーブルやリソースファイルの作成、展開などを想定する インストール処理等の必要ない単純なプラグインの場合はハンドラクラスやメソッドを定義しなくてもよい
(引数はconfig.ymlをパースした内容とEccube\Application)
インストール、アップデート、アンインストール時の動作
プラグイン有効化、無効化時の動作
プラグイン固有設定画面
プラグイン一覧画面からプラグイン固有の設定画面を開きたい場合、以下の名前で定義すること ルーティング名: /admin/plugin/$PLUGIN_CODE/config コントローラ名: Plugin\$PLUGIN_CODE\Controller\ConfigController
ここでは名前だけを定義 (ルートの定義は各プラグインのServiceにて行う必要がある)