3

私はzf2でコントローラープラグインを書いています。次のメソッドを使用してプラグイン内からコントローラーを取得しますが、nullを返します。

$controller = $this->getController()

なにか提案を?

4

2 に答える 2

2

この回答は、ZF1での私の経験と、ZF2コードの概要に基づいていることに注意してください。この答えをチェックしてください。

私はまだZF2で遊んでいませんが、ディスパッチプロセスとプラグインがZF1に似ている場合、コントローラーがインスタンス化されていないため、プラグインはコントローラーにアクセスできません(少なくとも些細な方法ではありません)。プラグインフック。

更新:ストックZF2コントローラープラグインのいくつかをざっと見て(カスタムプラグインの作成に関する公式ドキュメントが見つからないようです)、次のようなチェックを参照してください:

$controller = $this->getController();
if (!$controller || !method_exists($controller, 'plugin')) {
//...

そのため、コントローラーが設定されていない場合があります。プラグインは(私が理解している)イベントリスナーもサポートしているので、コントローラーが割り当てられる前など、応答プロセスのさまざまな時点でプラグインを使用できると思います。

うまくいけば、ZF2を使用している誰かがやって来て、私をまっすぐにすることができます; しかし、おそらく私は少なくともあなたをある程度合理的な方向に向けました。

于 2012-11-01T06:31:55.033 に答える
1

プラグインにコントローラーが設定されていない2つのオプションがあります。

  1. ディスパッチ前にプラグインマネージャーからプラグインを呼び出すため、コントローラーはまだ設定されていません
  2. プラグイン内のコントローラーを呼び出す__construct()

最初の例の典型的な例は、onBootstrap()明らかにコントローラーがないモジュールクラスのメソッドです。

public function onBootstrap($e)
{
  $app = $e->getApplication();
  $sm  = $app->getServiceManager();

  $plugins = $sm->get('ControllerPluginManager');
  $plugin  = $plugins->get('my-plugin');

  // $plugin->getController() === null
}

これは明らかな例のようですが、コントローラーがすでに存在すると誤って想定している場合もあります(たとえば、アプリケーションの実行中、ルートフェーズで、ディスパッチがまだ行われている必要があります)。

2番目の例は、コントローラーにセッターインジェクションが注入されているためです。セッターは建設後に呼び出されます。擬似コードでは、これは起こります:

$plugin = new $class;
$plugin->setController($controller);

このようなプラグインをお持ちの場合:

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

class MyPlugin extends AbstractPlugin
{
  public function __construct()
  {
    // $this->getController() === null
  }
}

そのフェーズではコントローラーが設定されていないことに気づきました。

于 2012-11-01T10:44:48.160 に答える