Zend Framework: Как внедрить свойство контроллера из Zend_Controller_Plugin - PullRequest
3 голосов
/ 01 октября 2010

Я написал плагин, который должен установить свойство на контроллере, который в данный момент отправляется. Например, если мой плагин:

class Application_Plugin_Foo extends Zend_Controller_Plugin_Abstract
{
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {
        // Get an instance of the current controller and inject the $foo property
        // ???->foo = 'foo';
    }
}

Я хочу иметь возможность сделать это:

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
        {
            $this->view->foo = $this->foo;
        }
    }
}

Любая помощь очень ценится!

Ответы [ 2 ]

3 голосов
/ 02 октября 2010

Контроллер действий не доступен напрямую через плагин фронт-контроллера.Это диспетчер, который создает экземпляр объекта контроллера, и он, кажется, не сохраняет его в доступном месте.

Однако, контроллер доступен из любых зарегистрированных помощников действий.Так как у помощников действий есть хук preDispatch, вы можете делать инъекции там.

Итак, в library/My/Controller/Helper/Inject.php:

class My_Controller_Helper_Inject extends Zend_Controller_Action_Helper_Abstract
{
    public function preDispatch()
    {
        $controller = $this->getActionController();
        $controller->myParamName = 'My param value';
    }
}

Затем зарегистрируйте экземпляр помощника в application/Bootstrap.php:

protected function _initControllerInject()
{
    Zend_Controller_Action_HelperBroker::addHelper(
        new My_Controller_Helper_Inject()
    );
}

И, как всегда, обязательно включите My_ в качестве пространства имен автозагрузчика в configs/application.ini:

autoloaderNamespaces[] = "My_"

Затем в контроллере получите доступ к значению напрямуюкак общедоступная переменная-член:

public function myAction()
{
    var_dump($this->myParamName);
}

Одна вещь, на которую следует обратить внимание: поскольку помощник использует хук preDispatch(), я считаю, что он будет вызываться при каждом действии, даже при внутреннем forward().

1 голос
/ 01 октября 2010

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

Через параметры запроса

class Application_Plugin_Foo extends Zend_Controller_Plugin_Abstract
{
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {
        $yourParam = 'your value';
        if($request->getParam('yourParam')) {
           // decide if you want to overwrite it, the following assumes that you do not care
           $request->setParam('yourParam', $yourParam);
        }
    }
}

И в Zend_Controller_Action::xxxAction(): $this->getParam('yourParam');


Через Zend_Controller_Action_Helper_Abstract

В блоге MWOP упоминается другой способ, но вместо этого он принимает форму помощника действий: AПростой ресурсный инжектор для контроллеров действий ZF .Его пример позволит вам получить доступ к любой переменной в Zend_Controller_Action как $this->yourParam.

...