Создание простого доступа к ресурсам из ZF контроллера
Posted in PHP, Tips And Tricks, ZendFramework on March 22nd, 2010 by Yaroslav Vorozhko – 2 CommentsБыло бы очень хорошо иметь возможность доступа к загружаемым в bootstrap ресурсам из контроллеров приложения. Например, я хотел бы получить доступ к "DB" ресурсу из контроллера следующим образом $this->db;
Для этого напишем Action Helper, который будет загружать определенные ресурсы в контроллер приложения:
-
class My_ResourceInjector extends Zend_Controller_Action_Helper_Abstract
-
{
-
protected $_resources;
-
-
public function __construct(array $resources = array())
-
{
-
$this->_resources = $resources;
-
}
-
-
public function preDispatch()
-
{
-
$bootstrap = $this->getBootstrap();
-
$controller = $this->getActionController();
-
foreach ($this->_resources as $name) {
-
if ($bootstrap->hasResource($name)) {
-
$controller->$name = $bootstrap->getResource($name);
-
}
-
}
-
}
-
-
public function getBootstrap()
-
{
-
return $this->getFrontController()->getParam('bootstrap');
-
}
-
}
и инициализируем его в bootstrap:
-
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
-
{
-
protected function _initResourceInjector()
-
{
-
Zend_Controller_Action_HelperBroker::addHelper(
-
new My_ResourceInjector(array(
-
'db',
-
'layout',
-
'navigation',
-
));
-
);
-
}
-
}
Код выше, создаст ссылки на ресурсы: db, layout и navigation. Это значит, что теперь вы можете получить к ним прямой доступ из контроллеров.
-
class FooController extends Zend_Controller_Action
-
{
-
public function barAction()
-
{
-
$this->layout->disableLayout();
-
$model = $this->getModel();
-
$model->setDbAdapter($this->db);
-
$this->view->assign(
-
'model' => $this->model,
-
'navigation' => $this->navigation,
-
);
-
}
-
-
// ...
-
}
Этото решение ведет к некоторому упрощению - теперь нет необходимости вытягивать bootstrap из объекта инициализации, а потом вытягивать ресурс.
Но, у этого решения есть несколько проблем: Откуда мы знаем, какие ресурсы были связаны с контроллером? Как мы можем это контролировать?
Отсюда, вытекает решение создать пул необходимых ресурсов для контроллера.
read more »
