Novembro 29th 2008
Injeção de dependência com Zend Framework
É comum ver por ai, as pessoas fazendo o setup da aplicação sempre no arquivo de bootstrap do Zend, algo do tipo:
arquivo: index.php
-
require_once 'Initializer.php';
-
require_once 'Zend/Loader.php';
-
-
Zend_Loader::registerAutoload();
-
-
$frontController = Zend_Controller_Front::getInstance();
-
-
//inicializando configuração do banco de dados
-
$db = new Zend_Db_Adapter_Oracle(array(
-
'username' => 'xxxxxx',
-
'password' => 'xxxxxx',
-
'dbname' => 'xe'
-
));
-
-
Zend_Db_Table_Abstract::setDefaultAdapter($db);
-
-
//inicializando configuração de routes
-
//...
-
-
// inicializando layout
-
Zend_Layout::startMvc();
-
-
// inicializando componente tal ....
-
-
$frontController->addControllerDirectory(dirname(__FILE__) . '/application/default/controllers', 'default');
-
$frontController->dispatch();
Porém, existem maneiras mais fáceis (e mais elegantes) de fazer isso. Injeção de Dependência é uma delas. Com o Zend Framework existem alguns pontos onde podemos aplicar este tipo de abordagem, utilizando Action Helpers, View Helpers e Plugins. Já expliquei aqui no blog como utilizar plugins, no post Não estenda. Plugue!.
O exemplo abaixo é uma alternativa para setup utilizando plugins, para os usuários do Zend Studio for Eclipse isso é talvez seja familiar, já que a IDE gera o projeto mais ou menos desta mesma forma.
Primeiro nosso plugin:
-
<?php
-
-
require_once 'Zend/Controller/Plugin/Abstract.php';
-
require_once 'Zend/Controller/Front.php';
-
require_once 'Zend/Controller/Request/Abstract.php';
-
require_once 'Zend/Controller/Action/HelperBroker.php';
-
-
/**
-
* plugin de inicialização da aplicação
-
*
-
*/
-
class Initializer extends Zend_Controller_Plugin_Abstract
-
{
-
-
protected static $_config;
-
-
protected $_env;
-
-
protected $_front;
-
-
protected $_root;
-
-
/**
-
* Constructor
-
*
-
* inicializa configurações
-
*
-
* @param string $env (development, test, production)
-
* @param string|null $root
-
* @return void
-
*/
-
public function __construct($env, $root = null)
-
{
-
$this->_setEnv($env);
-
if (null === $root) {
-
$root = realpath(dirname(__FILE__) . '/../');
-
}
-
$this->_root = $root;
-
-
$this->_front = Zend_Controller_Front::getInstance();
-
-
$this->initPhpConfig();
-
}
-
-
/**
-
* seta ambiente
-
*
-
* @param string $env
-
* @return void
-
*/
-
protected function _setEnv($env)
-
{
-
$this->_env = $env;
-
}
-
-
-
/**
-
* inicializa configurações do php
-
*
-
* @return void
-
*/
-
public function initPhpConfig()
-
{
-
// seta parametros para ambiente de teste
-
if ($this->_env == 'test') {
-
// habilita todos os erros do php
-
error_reporting(E_ALL | E_STRICT);
-
ini_set('display_startup_errors', 1);
-
ini_set('display_errors', 1);
-
-
$this->_front->throwExceptions(true);
-
}
-
}
-
-
/**
-
* faz todas as inicializações antes do inicio do roteamento para os controllers
-
*
-
* @return void
-
*/
-
public function routeStartup(Zend_Controller_Request_Abstract $request)
-
{
-
$this->initDb();
-
$this->initHelpers();
-
$this->initView();
-
$this->initPlugins();
-
$this->initRoutes();
-
$this->initControllers();
-
}
-
-
/**
-
* inicializa banco de dados
-
*
-
* @return void
-
*/
-
public function initDb()
-
{
-
$db = new Zend_Db_Adapter_Oracle(array(
-
'username' => 'xxxxx',
-
'password' => 'xxxxx',
-
'dbname' => 'xe'
-
));
-
-
Zend_Db_Table_Abstract::setDefaultAdapter($db);
-
}
-
-
/**
-
* inicializa os action helpers
-
*
-
* @return void
-
*/
-
public function initHelpers()
-
{
-
Zend_Controller_Action_HelperBroker::addPath('../application/default/helpers', 'Zend_Controller_Action_Helper');
-
}
-
-
/**
-
* inicializa o view
-
*
-
* @return void
-
*/
-
public function initView()
-
{
-
Zend_Layout::startMvc(array(
-
'layoutPath' => $this->_root . '/application/default/layouts',
-
'layout' => 'main'
-
));
-
-
}
-
-
/**
-
* inicializa plugins
-
*
-
* @return void
-
*/
-
public function initPlugins()
-
{
-
}
-
-
/**
-
* inicializa routes
-
*
-
* @return void
-
*/
-
public function initRoutes()
-
{
-
}
-
-
/**
-
* inicializa os controllers
-
*
-
* @return void
-
*/
-
public function initControllers()
-
{
-
$this->_front->addControllerDirectory($this->_root . '/application/default/controllers', 'default');
-
}
-
}
Após isso, nosso arquivo de bootstrap:
-
require_once 'Initializer.php';
-
require_once 'Zend/Loader.php';
-
-
Zend_Loader::registerAutoload();
-
-
$frontController = Zend_Controller_Front::getInstance();
-
$frontController->registerPlugin(new Initializer('development'));
-
$frontController->dispatch();
Dessa forma criamos as rotinas de setup e deixamos que o próprio Zend inicialize as coisas para nós.
[]s

