Как передать данные / переменные / объекты в Zend_Controller_Plugin
Я конвертирую старое приложение ZF (оно использует раннюю версию ZF, где мы использовали ручную загрузку / настройку приложения в index.php) в последнюю версию, и в одном из плагинов мы отправляем данные непосредственно в конструктор плагинов.
$front->registerPlugin(new My_Plugin_ABC($obj1, $obj2))
Теперь в текущей версии мы можем зарегистрировать плагин, напрямую предоставив детали в application.ini, и я хочу придерживаться этого подхода (регистрация с использованием файла конфигурации). Поэтому во время тестирования я заметил, что конструктор плагина вызывается довольно рано при начальной загрузке, поэтому единственная опция, с которой я остаюсь, - это использование Zend_Registry для хранения данных и извлечения их в хуках. Так это правильный путь? или есть ли другие способы лучше
РЕДАКТИРОВАТЬ Плагин фактически управлял ACL и Auth и получал пользовательские объекты ACL и AUTH. Это с помощью крючка preDispatch.
2 ответа
Итак, вы можете рассматривать ваши 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
}
}
Acl нужен во многих других местах, поэтому хранить его в Zend_Registry - классная вещь, и поскольку Zend_Auth одноэлементный, вы можете получить к нему доступ $auth = Zend_Auth::getInstance()
; где угодно, так что нет необходимости хранить аутентификацию в реестре.
Наконец, если вы расширили класс Zend_Acl для своего пользовательского acl, то лучше сделать его также одиночным. Тогда вы можете получить доступ к ACL My_Acl::getInstance();
где My_Acl является подклассом Zend_Acl .