{"action":"created","issue":{"url":"https://api.github.com/repos/EC-CUBE/ec-cube/issues/242","labels_url":"https://api.github.com/repos/EC-CUBE/ec-cube/issues/242/labels{/name}","comments_url":"https://api.github.com/repos/EC-CUBE/ec-cube/issues/242/comments","events_url":"https://api.github.com/repos/EC-CUBE/ec-cube/issues/242/events","html_url":"https://github.com/EC-CUBE/ec-cube/issues/242","id":83354510,"number":242,"title":"プラグインの優先度制御仕様","user":{"login":"aminotsukasa","id":8298448,"avatar_url":"https://avatars.githubusercontent.com/u/8298448?v=3","gravatar_id":"","url":"https://api.github.com/users/aminotsukasa","html_url":"https://github.com/aminotsukasa","followers_url":"https://api.github.com/users/aminotsukasa/followers","following_url":"https://api.github.com/users/aminotsukasa/following{/other_user}","gists_url":"https://api.github.com/users/aminotsukasa/gists{/gist_id}","starred_url":"https://api.github.com/users/aminotsukasa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aminotsukasa/subscriptions","organizations_url":"https://api.github.com/users/aminotsukasa/orgs","repos_url":"https://api.github.com/users/aminotsukasa/repos","events_url":"https://api.github.com/users/aminotsukasa/events{/privacy}","received_events_url":"https://api.github.com/users/aminotsukasa/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":10,"created_at":"2015-06-01T07:09:33Z","updated_at":"2015-06-02T04:07:47Z","closed_at":null,"body":"プラグイン毎の優先度制御の方法を考えてみました。\r\nご意見よろしくお願いします。\r\n\r\n# EC-CUBE3 Plugin間の優先度制御\r\n\r\n## 課題\r\n稼働環境に同じイベントをフックする複数のプラグインを同時にインストールし、各プラグインのイベントハンドラがパラメータを書き換える場合、書き換える順序によっては想定しない動作が発生する恐れがある。\r\nさらに、監査、ロギング、デバッグ用等で他のプラグインより必ず先又は後で起動する必要のあるハンドラの起動順序を制御したい\r\n\r\n##### 例\r\n購入時のFormEventをカード決済プラグインと後払いプラグインのイベントハンドラが書き換える場合、後のハンドラが書き換えるフォーム要素を前のプラグインが削除している可能性がある\r\n\r\n## 対策\r\n管理画面からユーザが各イベントのハンドラの起動順を設定できるようにする\r\n例：後払い(1)→カード決済(2) →監査(3)の順でFormEventのイベントハンドラが起動\r\n起動順序は管理画面等からDB上のハンドラ優先度テーブル（仮）に保持する。\r\n\r\n### テーブル構成\r\nハンドラ優先度テーブルは以下のフィールドを保有する\r\n\r\n* id:int    (サロゲートキー)\r\n* event:string not null (イベント名)\r\n* priority:int not null (優先度)\r\n* plugin_id:int not null(プラグインID)\r\n* handler:string not null(ハンドラ名)\r\n\r\n    event,priorityの2フィールドでユニーク\r\n\r\n## 起動優先度とハンドラ種別\r\n\r\n* 起動優先度は0-999までとする\r\n* 優先度は100-899は**通常型ハンドラ**用とする\r\n* 優先度1-99は**先発型ハンドラ**用とする(デバッグ、監査用を想定)\r\n* 優先度900-999は**後発型ハンドラ**用とする(同上)\r\n* 優先度0は実行時にハンドラを登録しない\r\n\r\n## プラグインインストール時の動作\r\n\r\n* 各プラグインのgetSubscribedEvents内のイベントハンドラと優先度をハンドラ優先度テーブルに挿入する\r\n* 当該イベントにハンドラが1件も登録されていない場合のデフォルト優先度は以下のとおり\r\n* * 先発型:1 \r\n* * 通常型:100\r\n* * 後発型:900\r\n* ハンドラが既に登録されている場合、既に存在する同型ハンドラ\r\nのイベントの優先度の最大値+1を登録する\r\n（ハンドラが既に100,101、900に登録されている場合に通常ハンドラを登録すると102に登録される）\r\n* ハンドラ種別毎に決められた優先度枠に空きがない場合、プラグインのインストールは失敗する\r\n\r\n## Webアプリケーション実行時の動作\r\n\r\n* プラグインのイベンドハンドラをディスパッチャに登録する際(Application.php等)、優先度テーブルの優先度(昇順)に各ハンドラを登録する\r\n* イベントが実際に発生すると登録された順にハンドラが起動する\r\n\r\n## ハンドラ優先度変更画面の動作\r\n* 各ハンドラの優先度をユーザ入力に基づいてアップデートする\r\n* ただし、優先度はハンドラ種別（通常、先発、後発）毎の範囲内に限定される\r\n\r\n## プラグイン開発者への影響\r\n\r\n* getSubscribedEventsはハンドラのメソッド名と優先度（数値）を返すが、メソッド名と種別（通常、先発、後発）を返すように変更\r\n* （開発者向けの指針）通常型プラグインとの衝突を防ぐため、先発型、後発型のハンドラでは渡されたパラメータを書き換えないことが望ましい"},"comment":{"url":"https://api.github.com/repos/EC-CUBE/ec-cube/issues/comments/107795721","html_url":"https://github.com/EC-CUBE/ec-cube/issues/242#issuecomment-107795721","issue_url":"https://api.github.com/repos/EC-CUBE/ec-cube/issues/242","id":107795721,"user":{"login":"ttsuru","id":578548,"avatar_url":"https://avatars.githubusercontent.com/u/578548?v=3","gravatar_id":"","url":"https://api.github.com/users/ttsuru","html_url":"https://github.com/ttsuru","followers_url":"https://api.github.com/users/ttsuru/followers","following_url":"https://api.github.com/users/ttsuru/following{/other_user}","gists_url":"https://api.github.com/users/ttsuru/gists{/gist_id}","starred_url":"https://api.github.com/users/ttsuru/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ttsuru/subscriptions","organizations_url":"https://api.github.com/users/ttsuru/orgs","repos_url":"https://api.github.com/users/ttsuru/repos","events_url":"https://api.github.com/users/ttsuru/events{/privacy}","received_events_url":"https://api.github.com/users/ttsuru/received_events","type":"User","site_admin":false},"created_at":"2015-06-02T04:07:47Z","updated_at":"2015-06-02T04:07:47Z","body":"@Yangsin \r\n了解しました。こちらは別件として捉えておきます。\r\n優先度制御については私の方では特に気になったことはありません。\r\n競合に関しては現状の仕組みではある程度は致し方ない部分もあるのかなと思います。\r\n\r\n1点だけあるとすれば、フックポイントで使われている routing_name を_から.に置き換えている部分は置き換えない方が良いかと思います。\r\n\r\nRouting名が product_detail の場合\r\n```\r\nproduct.detail.before\r\n-> eccube.product_detail.before など\r\n```\r\n\r\n"}}