Как передать данные / переменные / объекты в Zend_Controller_Plugin - PullRequest
0 голосов
/ 24 сентября 2011

Я конвертирую старое приложение ZF (оно использует раннюю версию ZF, где мы использовали ручную загрузку / настройку приложения в index.php) в последнюю версию, и в одном из плагинов мы отправляем данные непосредственно в конструктор плагинов

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

Теперь в текущей версии мы можем зарегистрировать плагин, напрямую предоставив детали в application.ini, и я хочу придерживаться этого подхода (регистрация с использованием файла конфигурации). Поэтому во время тестирования я заметил, что конструктор плагинов вызывается довольно рано при начальной загрузке, поэтому единственная опция, с которой я остаюсь, - это использование Zend_Registry для хранения данных и извлечения их в хуках. Так это правильный путь? или есть другие лучшие способы

EDIT Плагин фактически управлял ACL и Auth и получал пользовательские объекты ACL и AUTH. Используется крючок preDispatch.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2011

Acl нужен во многих других местах, поэтому хранить его в Zend_Registry - классная вещь, и поскольку Zend_Auth является одноэлементным, вы можете получить к нему доступ $auth = Zend_Auth::getInstance(); в любом месте, так что нет необходимости хранить аутентификацию в реестре.

Наконец, если вы расширили класс Zend_Acl для своего пользовательского acl, лучше сделать его также одиночным. Затем вы можете получить доступ к acl My_Acl::getInstance();, где My_Acl является подклассом Zend_Acl.

0 голосов
/ 24 сентября 2011

Хорошо, так что вы можете рассматривать ваши ACL и Auth обработчики как некоторые ресурсы приложения и иметь возможность добавлять опции конфигурации для них в вашем приложении .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

     }
 }
...