0

このプラグインは、管理モジュール ディレクトリplugins内のディレクトリにあります。したがって、次のとおりです。application/modules/admin/plugins/LayoutPlugin.php

<?php
class LayoutPlugin extends Zend_Controller_Plugin_Abstract
{
   public function preDispatch(Zend_Controller_Request_Abstract $request)
   {
      $layout = Zend_Layout::getMvcInstance();
      $view = $layout->getView();

      $view->whatever = 'foo';
   }
}

変数をレイアウトビューに送信するために使用したいと思います。管理者ブートストラップで試行するFatal error: Class 'LayoutPlugin' not foundたびに発生します。Zend_Controller_Front::getInstance()->registerPlugin(new LayoutPlugin());

モジュール内にプラグインをロードするにはどうすればよいですか?

4

2 に答える 2

1

これは古い質問であることは知っていますが、これは常に私を悩ませていたものです。ZF 2 がそれを解決するために何かをしたかどうかはわかりませんが (私はまだそれを試す機会がありませんでした)、ZF 1 でこれに対処するプラグイン ローダー プラグインを書きました!

もちろん問題は、モジュール オートローダをセットアップしてプラグインをモジュールのプラグイン フォルダに保持している場合でも、登録ではなくオートローディング (クロス モジュール) のみをセットアップすることです。これは、application.ini の 1 行でプラグインをインスタンス化できることを意味しますが、モジュールごとに自動ロードおよび登録されます。

とにかく、モジュールプラグインがアクティブなモジュールに対してのみ登録されていることを確認するための可能な解決策があります。別の方法として、クラス マップを提供する代わりに、モジュールのプラグイン ディレクトリ内のすべてのファイルをループすることもできますが、それは見苦しく感じます...そしておそらく遅いでしょう。

<?php

class BaseTen_Controller_Plugin_ModulePluginLoader extends Zend_Controller_Plugin_Abstract {

    private $_pluginMap;

    public function __construct(array $pluginMap) {
        $this->_pluginMap = $pluginMap;
    }

    public function routeShutdown(Zend_Controller_Request_Abstract $request) {
        $module = $request->getModuleName();

        if(isset($this->_pluginMap[$module])) {

            $front = Zend_Controller_Front::getInstance();

            foreach($this->_pluginMap[$module] as $plugin) {
                $front->registerPlugin(new $plugin());
            }
        }
    }
}

classMap をコンストラクターに渡す必要があるため、このプラグインを明示的にインスタンス化して、application.ini の行ではなくフロント コントローラーに登録する必要があります。

public function _initPluginLoader() {
    $front = Zend_Controller_Front::getInstance();
    $front->registerPlugin(new BaseTen_Controller_Plugin_ModulePluginLoader(array(
        'default' => array(
            'Plugin_Foo',
            'Plugin_Bar',
            ...
        ),
        'foo' => array(
            'Foo_Plugin_Foo',
            'Foo_Plugin_Bar',
            ...
        )
    )));
}

プラグインを実行できる最も早い時期はrouteShutdownです。そうしないと、アクティブなモジュールがわかりません。ただし、これが意味することは、このメソッドを使用して登録された他のプラグインは、それdispatchLoopStartup以降のみ実行できるということです。ほとんどの場合、私たちはおそらくpreDispatchandpostDispatchフックに関心がありますが、覚えておく価値があります。

于 2012-11-16T12:47:43.493 に答える
1

モジュール ブートストラップは、デフォルトでモジュール オートローダをセットアップするため、クラスの名前を Admin_Plugin_LayoutPlugin に変更すると、ZF はそれを見つけることができるはずです。

管理モジュールを使用しているかどうかに関係なく、管理ブートストラップ (すべてのブートストラップと同様) が実行されることに注意してください。 admin は、プラグインを登録する前の現在のモジュールです。

于 2010-09-08T19:32:54.590 に答える