0

古いZFアプリ(index.phpで手動でアプリの読み込み/構成を行っていた初期のZFバージョンを使用)を最新バージョンに変換しています。プラグインの1つで、プラグインコンストラクターにデータを直接送信しています。

$front->registerPlugin(new My_Plugin_ABC($obj1, $obj2))

現在のバージョンでは、application.iniで詳細を直接提供することでプラグインを登録できますが、このアプローチを維持したいと思います(構成ファイルを使用して登録します)。そのため、テスト中に、プラグインコンストラクターがブートストラップのかなり早い段階で呼び出されることに気付きました。そのため、残された唯一のオプションは、Zend_Registryを使用してデータを格納し、フックで取得することです。それで、それは正しい方法ですか?または他のより良い方法はありますか

編集 プラグインは実際にはACLとAuthを管理し、カスタムACLとAUTHオブジェクトを受信して​​いました。preDispatchフックを使用します。

4

2 に答える 2

0

これで、ACLハンドラーとAuthハンドラーをいくつかのアプリケーションリソースと見なし、それらの構成オプションをapplication.iniに追加できるようになります。

 //Create a Zend Application resource plugin for each of them

 class My_Application_Resource_Acl extends Zend_Application_Resource_Abstract {
     //notice the fact that a resource last's classname part is uppercase ONLY on the first letter (nobody nor ZF is perfect)
     public function init(){
         // initialize your ACL here
         // you can get configs set in application.ini with $this->getOptions()

         // make sure to return the resource, even if you store it in Zend_registry for a more convenient access
         return $acl;
     }
 }

 class My_Application_Resource_Auth extends Zend_Application_Resource_Abstract {
     public function init(){
         // same rules as for acl resource
         return $auth;
     }
 }

 // in your application.ini, register you custom resources path
 pluginpaths.My_Application_Resource = "/path/to/My/Application/Resource/"
 //and initialize them
 resources.acl =    //this is without options, but still needed to initialze
 ;resources.acl.myoption = myvalue // this is how you define resource options

 resources.auth =    // same as before

 // remove you plugin's constructor and get the objects in it's logic instead
 class My_Plugin_ABC extends Zend_Controller_Plugin_Abstract {
     public function preDispatch (Zend_Controller_Request_Abstract $request){
          //get the objects
          $bootstrap = Zend_Controller_Front::getInstance()->getParam("bootstrap");
          $acl = $bootstrap->getResource('acl');
          $auth = $bootstrap->getResource('auth');
          // or get them in Zend_Registry if you registered them in it

          // do your stuff with these objects

     }
 }
于 2011-09-23T23:10:21.330 に答える
0

Aclは他の多くの場所で必要になるため、Zend_Registryに保存するのはクールなことです。また、Zend_Authはシングルトンであるため、アクセスできます$auth = Zend_Auth::getInstance()。どこでも好きな場所にあるので、レジストリに認証を保存する必要はありません。

最後に、カスタムacl用にZend_Aclクラスを拡張した場合は、シングルトンにする方がよいでしょう。My_Acl::getInstance(); 次に、My_AclがZend_Aclのサブクラスであるaclにアクセスできます。

于 2011-09-24T02:36:36.200 に答える