Project

General

Profile

Bug(バグ) #3083

--internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない

Added by Yuma Sakata about 7 years ago. Updated almost 2 years ago.

Status:
Fixed(完了)
Priority:
Normal(通常)
Assignee:
Target version:
Start date:
2012-06-26
Due date:
% Done:

100%

3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Unknown (未調査)

Description

Overview (現象)

--internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない

Environment (再現バージョン)

OpenPNE3.8.0

Way to repro (再現手順)

1. --internetオプション付けないでインストールする
2. 管理画面プラグイン設定ページ(/pc_backend.php/plugin/list)にアクセスする
3. 500エラーでアクセスできない

Way to fix (修正内容)

--internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできるように修正お願いします。


Related issues

Related to OpenPNE 3 - Backport(バックポート) #3012: --internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない Fixed(完了) 2012-04-23
Related to OpenPNE 3 - Bug(バグ) #3011: --internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない Won't fix(対応せず) 2012-04-23
Related to OpenPNE 3 - Task(タスク) #4040: #3083の修正コミットがstable-3.8.xのみに存在し、masterブランチに対するチケット及びPull Requestが存在しない New(新規) 2016-11-14

Associated revisions

Revision 41db124e (diff)
Added by Yuya Watanabe about 7 years ago

(fixes #3083) fixed not to occur Exception when channel server was not registered

History

#1 Updated by Yuya Watanabe about 7 years ago

例外拾う

#2 Updated by Yuya Watanabe about 7 years ago

  • Assignee set to Yuya Watanabe

#3 Updated by Yuya Watanabe about 7 years ago

再現が確認できなかったため下記コマンドにより本問題を解決した修正を取り除いて同じ問題を発生させ,その問題を根本的に解決する方法を模索する.

$ git revert 91ab72c82aac2f5a0157da43b9bc1d9cab673485
$ git revert 9048766dd64fba33ceb884ada476f4e8419b4843

発生する例外は sfPluginException である.エラーメッセージは下記の通り.

Unable to initialize channel "Unknown channel: pear.symfony-project.com" 

修正方針考察

plugin/list のページにアクセスすると apps/pc_backend/modules/plugin/actions/actions.class.php の 34 行目 executeList() メソッドが呼び出される.ここで,リクエストにはパラメータが与えられていないため $this->typo には'application' が入る.次に opInstalledPluginManager インスタンスが生成され,40, 44,48 行目と条件が変わって行き,最終的には 50 行目の処理が実行される.例外はここから投げられる.ここで 50行目が正常動作するならば $this->plugins に入っているべきなのはクラスの名前とメソッド名から分かる通り, インストールされたプラグインのリストである.このアクションでは,すべてのプラグインのリストの表示および,リストからアクティベートするプラグインを設定することができるようにすることである. このとき opInstalledPluginManager が取得を行うべきなのは,あくまでもプラグインのリストであり,情報が取得できないなどの例外は list として与える際の詳細データに表すべきであると思う.この時点では opInstalledPluginManager が呼び出すメソッド内で例外は処理すべきであると提案する.

処理を opInstalledPluginManager() のなかに移す. $this->type が application の状態では getInstalledApplicationPlugins() メソッドが呼び出されるが 何れにせよメソッド内で getInstalledPlugins() メソッドが呼び出される.このとき,この getInstalledPlugins() メソッドに期待すべきなのは インストールされたプラグイン全部のリストである.そして アクションから呼び出されるメソッド群がその返り値を決定するために必要な type の情報を少なくともふくんでいる必要がある.例外自体は getInstalledPlugins() メソッドから投げられるので, ここでは 少なくとも type 情報を含んだ,プラグインインスタンスすべてのリストが返ってくるべきであるとして getInstalledPlugins() メソッド内で例外は処理されるべきであると提案する.

処理をさらに getInstalledPlugin() のなかに移す. この中ではコンテキストの設定インスタンスから getAllOpenPNEPlugins() メソッドを呼び出している. getInstalledPlugin() メソッドのなかでさらに getAllOpenPNEPlugins() メソッドを呼び出しているという点が腑に落ちないが,処理を見る限りではおそらくインスタンス自体ではなくインスタンスと紐付くキーとなる集合が得られるものと思われる.実際に,例外を投げるのはキーから得られる getPluginInstance() メソッドであるため, getAllOpenPNEPlugins() から得られる情報が 「インストールされたプラグインのリスト」と等価であり, getPluginsInstance() メソッド内で type を決定するのに有効な処理が行われないのであればここで例外を拾うことが適切であるという選択ができる.つまり,例外を処理する候補の一つと言える.このとき type の情報が得られない状態である場合を考慮する必要があるが,これは getPluginInstance() 内でそのような情報が得られないことが明らかであるときに考えるべきものとして,議論を後回しにする.

getPluginInstance() では opPlugin の static な getInstance() メソッド を呼び出している.opPlugin::getInstance() は Flyweight パターン を用いているように見える. opPlugin クラスが Factory と生成されるオブジェクトそのものの両方を表しているようである.opPlugin オブジェクトのインスタンスを得るために必要な情報は,プラグインのディレクトリにある package.yml ファイルから取得できるものか,チャンネルサーバから得られる情報を用いている.今回の問題において発生しうる状態は,後者において確認しようとするチャンネルサーバが symfony 側でハードコーディングされており,登録されていない場合に例外を投げるようである.取得ができないという状態ならば 情報なしとして opPlugin オブジェクトのインスタンスが完了するように実装すべきであると思い,この部分について実装を進める方針とする.

本問題とは関係がないといえば無いが, opPluginManager のように Manager という名前がついているものの,特に広い範囲でのマネージをしているわけではなくチャンネルサーバとのやり取りやその管理を行なっている実装を鑑みると,そのクラス名は正確にその役割を表していないのではないかと感じた.親クラスの sfSymfonyPluginManager については Channel という文言を用いていないため内部実装をごっそり変更するといった使い方ができると感じたが opPluginManager についてはチャンネルサーバに依存したメソッドがあるため Manager よりも Channel というように内部実装を表した名前が適当であると思われる.

#4 Updated by Yuya Watanabe about 7 years ago

  • Status changed from New(新規) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

更新履歴 41db124efa99201060a2d17cecac966045b8c611 で適用されました。

#5 Updated by Yuya Watanabe about 7 years ago

表示されるログ

fail to get plugin package information cause: sfPluginException : Unable to initialize channel "Unknown channel: pear.symfony-project.com" 

#6 Updated by Rimpei Ogawa almost 7 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • % Done changed from 50 to 70

#7 Updated by Yuma Sakata almost 7 years ago

  • Status changed from Pending Testing(テスト待ち) to Fixed(完了)
  • % Done changed from 70 to 100

テストOKです。

#8 Updated by kaoru n almost 4 years ago

  • 3.8 で発生するか set to Unknown (未調査)

#9 Updated by Youichi Kimura over 2 years ago

  • Related to Task(タスク) #4040: #3083の修正コミットがstable-3.8.xのみに存在し、masterブランチに対するチケット及びPull Requestが存在しない added

#10 Updated by Chiharu Nakajima almost 2 years ago

3.6発生せず
3.8対応済み

Also available in: Atom PDF