20 de julho de 2009
Quando estamos aprendendo a utilizar algum framework, sempre surgem algumas dúvidas, de início simples que muitas vezes não sabemos onde recorrer e acabamos perdendo um pouco de tempo.
Trabalhar com módulos no Zend Framework é fácil, mas se você não tiver o hábito de ler a documentação, você vai nadar, nadar e morrer na praia.
Organizando o seu projeto desta forma, você separa a estrutura da sua aplicação MVC e a reutiliza em diferentes front controllers.
Exemplo:
Agora que temos a nossa estrutura, devemos dizer para o bootstrap aonde ela esta.
Se baseando no Quick Start da Zend:
<?php
//public/index.php
// Set the initial include_path. You may need to change this to ensure that
// Zend Framework is in the include_path; additionally, for performance
// reasons, it's best to move this to your web server configuration or php.ini
// for production.
set_include_path(implode(PATH_SEPARATOR, array(
realpath(dirname(__FILE__) . '/../library'),
get_include_path(),
)));
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
/** Zend_Application */
require_once 'Zend/Application.php';
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/default/configs/application.ini'
);
try {
$application->bootstrap()
->run();
}
catch (Exception $exception) {?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"; "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Zend Framework Default Application</title>
</head>
<body>
<h1>An error occurred </h1>
<h3>Exception information:</h3>
<p>
<b>Message:</b> <?=$exception->getMessage() ?>
</p>
<h3>Stack trace:</h3>
<pre><?=$exception->getTraceAsString() ?></pre>
</body>
</html>
<?
}
/public/index.php carrega o nosso arquivo de configuração application.ini, preste atenção, nele dizemos aonde esta o nosso bootstrap.php.
application.ini
[production] ;application/default/configs/application.ini ; PHP settings we want to initialize phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 debug = 1 ; Indicate the path and classname of the bootstrap bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" [staging : production] ; Were you to have a 'staging' environment, you could customize application ; settings here [testing : production] ; For testing, we want to display errors and use a different database phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 [development : production] ; For development, we want to display errors and use a different database phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1
No bootstrap.php definimos o path de cada módulo, segue abaixo:
<?php
//application/Bootstrap.php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected $_config;
protected $_frontController;
protected function _initConfig()
{
//Carrega meu arquivo de configuração application.ini com alguns parâmetros.
$this->_config = new Zend_Config_Ini(APPLICATION_PATH . '/default/configs/application.ini');
//Registra essa configuração como global.
//Para recuperar utilize Zend_Registry::get('config');
Zend_Registry::set('config', $this->_config);
}
protected function _initFrontController()
{
// Recebo uma instância do Zend_Controller_Front::getInstance();
$this->_frontController = Zend_Controller_Front::getInstance();
/*
Você deve utilizar o setControllerDirectory, serve para dizer aonde estão
os seus controladores, com essa configuração
podemos renderizar módulos diferentes, basta dizer o path.
*/
$this->_frontController->setControllerDirectory(array(
'default' => APPLICATION_PATH . '/default/controllers',
'admin' => APPLICATION_PATH . '/admin/controllers'
));
/*
Somente no controlador default, não é preciso digitar o name space.
No caso do admin, que precisamos digitar, você deve escrever suas classes
desta forma:
class Admin_IndexController extends Zend_Controller_Action
*/
}
public function run()
{
/*
Dispatch faz um processo que pega o objeto de requisição,
Zend_Controller_Request_Abstract Exrai o nome do modulo, controller,
action e parâmetros opcionais.
*/
$this->_frontController->dispatch();
}
}
Agora é só criar os seus models, controllers e views, lembrando que você deve respeitar a regra do name space.
Exemplo simples:
admin controller
<?php
//application/admin/controllers/IndexController.php
class Admin_IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$this->view->admin = 'Módulo Admin !';
}
}
admin view
<?//application/admin/views/scripts/index/index.phtml?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Zend Framework Trabalhando com Módulos</title> </head> <body> <h1><?=$this->admin?></h1> </body> </html>
default controller, lembrando que não é obrigatório digitar o name space.
<?php
//application/default/controllers/IndexController.php
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$this->view->default = 'Módulo Default !';
}
}
default view
<?//application/default/views/scripts/index/index.phtml?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Zend Framework Trabalhando com Módulos</title> </head> <body> <h1><?=$this->default?></h1> </body> </html>
Resultado:
Você garante a organização do projeto, fica melhor para dar manutenção, é uma estrutura convencional, que não foge da estrutura de diretórios do Zend Framework.
Fontes:
http://framework.zend.com/manual/en/zend.controller.modular.html
http://framework.zend.com/manual/en/zend.controller.dispatcher.html
Tags: PHP, Zend Framework
Olá Wellington,
Estou iniciando com Zend e estava procurando exatamente como fazer o site e a parte de admin.
Já estou utilizando o sistema de arquivos que disponibilizou.
Muito obrigado,
Carlos Henrique
@Carlos Henrique:
No começo parece ser complicado aplicar essa estrutura, mas depois que entendemos fica fácil.
Obrigado e continue visitando o blog !
Olá Wellington, Tentei usar a sua estrutura aqui e deu o seguinte erro:
Fatal error: Class ‘Zend_Application_Bootstrap_Bootstrap’ not found in C:\xampp\htdocs\zend_1\application\Bootstrap.php on line 6
O que pode ser isso?
@André Manoel:
No arquivo que disponibilizei para download não tem a library do Zend.
Inclua a library mais nova e coloque os arquivos dentro da pasta htdocs, na raiz, sem essa pasta zend_1. Ex: Zend Framework Estrutura Modular
Também pode ser alguma configuração no seu xampp, da uma lida nesse tutorial:
Configurando o Zend Framework
Obrigado pelo comentário.
cara, tava tentando entender como funcionava os módulos no zend, essa foi a ajuda que necessitava, é fogo ser fraco no inglês.
@alexandre:
Pô então o post te ajudou, ta valendo
legal o post!!!
mas agora fiquei com uma duvida observando a estrutura do projeto…
e como eu usaria o zend layout?
um para cada modulo?
@Felipe Duardo:
Da uma olhada nesse post http://wellrocha.com.br/blog/2009/09/23/zend-framework-renderizando-layouts-diferentes/
@Wellington Rocha:
sim so depois comecei a dar uma vasculhada no seu blog
valew e parabens pelos artigos!!!
Olá,
baixei seus arquivos de exemplo e eles funcionam perfeitamente… configurei meu projeto mas parece que ele continua vendo apenas o layout default, sabe o que pode ser?
abraço
ignore o comentario acima era pro outro post sobre layouts diferentes…
Legal seu post! Tenho certeza que vai ajudar muita gente!
Eu já trabalho diferente, eu crio uma pasta chamada modules, e lá eu coloco todos os modulos fica mais fácil para trabalhar com o Zend_Tool.
Abraços.
@Mingo Max:
Legal, não sabia que facilita para o Zend_Tool, pra falar a verdade nunca usei.
Peguei um projeto que foi iniciado por outro programador e a estrutura é com a pasta modules, mas como não usei o Zend_Tool acabei não vendo diferença.