Novembro 29th 2008 03:50 am
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
3 Comments »














Bruno Viana on 02 Dez 2008 at 14:14 #
Hm… muito bom! Sempre tive duvidas do que seria Injeção de Dependencia mas deu pra entender melhor agora!
Não sei se lembra de mim, estava no mesmo taxi que vc voltando da PHP Conf.. hehehe
Abração!
Diego Tremper on 02 Dez 2008 at 20:58 #
Lembro sim, tava meio dormindo mais lembro..hehe
Abraço!
Arian Maykon (Dead_Thinker) on 16 Jan 2009 at 21:40 #
Bem interessante, não sabia que era aplicado o conceito de injeção de dependência ai.
Uma abordagem parecida é a do Padraic no sistema de blog dele, o Bootstrapper.php.