EC-CUBE / ec-cube

EC-CUBE is the most popular e-commerce solution in Japan
https://www.ec-cube.net
Other
735 stars 645 forks source link

プラグインのインストーラ仕様 #256

Closed aminotsukasa closed 9 years ago

aminotsukasa commented 9 years ago

プラグインのインストーラの仕様を検討してみますた。

こここうしたほうがいいとかあったら指摘くださいませ

概要

プラグインのインストール等の状態変化時の動作とデータ構造を規定する。 また、プラグインのインストール、アンインストールに伴う初期化処理(個別プラグイン用テーブル、初期データ挿入)の実装方法を規定する

データ構造

プラグインマスタテーブル(dtb_pluginに相当)

ハンドラ優先度テーブル(dtb_plugin_hookpointに相当)

※event,priorityの2フィールドでユニークキー

(プラグイン毎の)config.yml

(プラグイン毎の)event.yml

※イベント名のキーに対応するvalueとして、handlerとtypeの二要素からなるハッシュ(ハンドラ定義)の配列が定義される。イベントとハンドラ定義は複数定義できる ※Typeは優先度定義(NORMAL FIRST LASTのいずれかの文字列を設定する) ※内容はgetSubscribedEvents()と同じですがオーナーズストア等でも使えるようymlへ移動


(プラグイン毎の)状態変化ハンドラクラス(プラグインメインクラスに相当) このクラスをプラグインへ同梱すると、各状態変化の際にメソッドがコールされる 処理としてはプラグイン固有のテーブルやリソースファイルの作成、展開などを想定する インストール処理等の必要ない単純なプラグインの場合はハンドラクラスやメソッドを定義しなくてもよい

namespace pluginname;
use Eccube\Plugin\AbstractPluginManager;

class PluginManager extends AbstractPluginManager {

    public function install($plugin,$app){}

    public function uninstall($config,$app){}

    public function enable($config,$app){}

    public function disable($config,$app){}

    public function update($config,$app){}
}

(引数はconfig.ymlをパースした内容とEccube\Application)

インストール、アップデート、アンインストール時の動作

プラグイン有効化、無効化時の動作

プラグイン固有設定画面

プラグイン一覧画面からプラグイン固有の設定画面を開きたい場合、以下の名前で定義すること ルーティング名: /admin/plugin/$PLUGIN_CODE/config コントローラ名: Plugin\$PLUGIN_CODE\Controller\ConfigController

ここでは名前だけを定義 (ルートの定義は各プラグインのServiceにて行う必要がある)

ttsuru commented 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 などもう少し直感的にしてはいかがでしょうか。

aminotsukasa commented 9 years ago

@ttsuru

config.ymlのフィールド定義に関してはdtb_pluginをとりあえずベースにしましたので、追加で必要なフィールドがあれば追加したほうがいいと思っています。

設定ファイルの書式については、app/config/eccubeの設定ファイルやsrc/Eccube/Resource のDoctrineのリソースがほぼyml形式なのです。 いちいち設定ファイル毎にymlとjsonが混ざるとかえって書きにくいのではないかと思いますがどう思われます?

namespaceは確かにissueの内容だと階層構造が変だと思いますので、 use Eccube\Plugin\AbstractBackstage とかでしょうか。

ttsuru commented 9 years ago

@aminotsukasa

dtb_plugin にありそうな内容はほぼ composer.json で定義できるので、そちらでやってしまってはどうでしょうか。 Wordpressや他のCMS、ECも含め、 composer.json を用意する動きが広がっていて、流れ的にはこのタイミングで変えてしまってはどうでしょうか。 ここはおそらくPHP界全体の流れで、個別にどうこうするよりは右に倣えで対応してしまってはと思います。

それ以外についてはEC-CUBEのプラグインの内容なのでymlでいいと思います。

namespace については Backstage が意味する内容が直感的にわかりませんでした。 Installなどの基底クラスであれば AbstractPluginManager などどうでしょうか。

また、今まであった、プラグイン自体の基底クラスはないのでしょうか。 2にあったような基底クラスがあってもよいのではと思いました。 Silexの ServiceProviderInterface のような形で、 PluginIntrface などがあるとよいなと思いました。

aminotsukasa commented 9 years ago

@ttsuru

composer.json 云々という話は https://github.com/EC-CUBE/ec-cube/issues/242 の続きでしょうか。プラグイン自体の基本的な構造の提案であれば情報が散逸してしますので上記のIssueにコメントしていただけませんか。

Backstageというクラス名はわかりにくいのでAbstractPluginManager に変えようと思います。

Plugin自体の基底クラスはこのIssueでは触れていませんのでまた別Issueに記載します

Yangsin commented 9 years ago

@aminotsukasa @ttsuru

3からは、プラグインとモジュールを統合し、2.13までのモジュールのオーナーズストアで通信インストールしていた形にインストールを統一したいと思っています。 プラグインマスタテーブル(dtb_pluginに相当)は、オーナーズストアに公開されている内容との整合性をたもつための、2.13までのmtb_moduleに近いものでよいと思います。 特にauthorやplugin_description のような内容はオーナーズストアと通信時に取得するべきかと。 オーナーズストアを使わないインストールの場合に、config.yml やcomposer.jsonを使う形ですかね。

ttsuru commented 9 years ago

@Yangsin オーナーズストアのレスポンスも composer.json が近いのでこちらでよいのではないでしょうか。 また、現状のオーナーズストアのdistファイルを使った方式よりは、2系のzipなどを解凍するだけのPluginのインストールにダウンロード機能を追加したものの方がよいような気がします。

aminotsukasa commented 9 years ago

event.ymlのサンプルです

https://github.com/aminotsukasa/ec-cube/blob/plugin_loader/app/Plugin/SampleEvent/event.yml

aminotsukasa commented 9 years ago

一部記載に抜けがありましたので追加しています

Yangsin commented 9 years ago

一度Wikiにうつし https://github.com/EC-CUBE/ec-cube/wiki/Plugin%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9%E3%83%BC%E4%BB%95%E6%A7%98 こちらはクローズさせていただきます。