Posts Tagged ‘Action Helpers’

Создание простого доступа к ресурсам из ZF контроллера

Posted in PHP, Tips And Tricks, ZendFramework on March 22nd, 2010 by Yaroslav Vorozhko – 2 Comments

Было бы очень хорошо иметь возможность доступа к загружаемым в bootstrap ресурсам из контроллеров приложения. Например, я хотел бы получить доступ к "DB" ресурсу из контроллера следующим образом $this->db;
Для этого напишем Action Helper, который будет загружать определенные ресурсы в контроллер приложения:

CODE:
  1. class My_ResourceInjector extends Zend_Controller_Action_Helper_Abstract
  2. {
  3.     protected $_resources;
  4.  
  5.     public function __construct(array $resources = array())
  6.     {
  7.         $this->_resources = $resources;
  8.     }
  9.  
  10.     public function preDispatch()
  11.     {
  12.         $bootstrap  = $this->getBootstrap();
  13.         $controller = $this->getActionController();
  14.         foreach ($this->_resources as $name) {
  15.             if ($bootstrap->hasResource($name)) {
  16.                 $controller->$name = $bootstrap->getResource($name);
  17.             }
  18.         }
  19.     }
  20.  
  21.     public function getBootstrap()
  22.     {
  23.         return $this->getFrontController()->getParam('bootstrap');
  24.     }
  25. }

и инициализируем его в bootstrap:

CODE:
  1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  2. {
  3.     protected function _initResourceInjector()
  4.     {
  5.         Zend_Controller_Action_HelperBroker::addHelper(
  6.             new My_ResourceInjector(array(
  7.                 'db',
  8.                 'layout',
  9.                 'navigation',
  10.             ));
  11.         );
  12.     }
  13. }

Код выше, создаст ссылки на ресурсы: db, layout и navigation. Это значит, что теперь вы можете получить к ним прямой доступ из контроллеров.

CODE:
  1. class FooController extends Zend_Controller_Action
  2. {
  3.     public function barAction()
  4.     {
  5.         $this->layout->disableLayout();
  6.         $model = $this->getModel();
  7.         $model->setDbAdapter($this->db);
  8.         $this->view->assign(
  9.             'model'      => $this->model,
  10.             'navigation' => $this->navigation,
  11.         );
  12.     }
  13.  
  14.     // ...
  15. }

Этото решение ведет к некоторому упрощению - теперь нет необходимости вытягивать bootstrap из объекта инициализации, а потом вытягивать ресурс.
Но, у этого решения есть несколько проблем: Откуда мы знаем, какие ресурсы были связаны с контроллером? Как мы можем это контролировать?
Отсюда, вытекает решение создать пул необходимых ресурсов для контроллера.
read more »