msgbartop
Lógica na Cabeça
msgbarbottom

Zend Framework Trabalhando com Módulos

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:

zend-framework-modular-structure

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:

zend-framework-trabalhando-com-modulos01

zend-framework-trabalhando-com-modulos02

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.

Download do exemplo.

Fontes:

http://framework.zend.com/manual/en/zend.controller.modular.html

http://framework.zend.com/manual/en/zend.controller.dispatcher.html

Share and Enjoy:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Twitter
  • Rec6
  • RSS

Tags: ,

13 Comentários

  1. |

    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

    ResponderResponder
  2. |

    @Carlos Henrique:

    No começo parece ser complicado aplicar essa estrutura, mas depois que entendemos fica fácil.

    Obrigado e continue visitando o blog !

    ResponderResponder
  3. |

    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?

    ResponderResponder
  4. |

    @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.

    ResponderResponder
  5. |

    cara, tava tentando entender como funcionava os módulos no zend, essa foi a ajuda que necessitava, é fogo ser fraco no inglês.

    ResponderResponder
  6. |

    @alexandre:

    Pô então o post te ajudou, ta valendo :D

    ResponderResponder
  7. |

    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?

    ResponderResponder
  8. |

    @Felipe Duardo:

    Da uma olhada nesse post http://wellrocha.com.br/blog/2009/09/23/zend-framework-renderizando-layouts-diferentes/

    ResponderResponder
  9. |

    @Wellington Rocha:

    sim so depois comecei a dar uma vasculhada no seu blog

    valew e parabens pelos artigos!!!

    ResponderResponder
  10. |

    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

    ResponderResponder
  11. |

    ignore o comentario acima era pro outro post sobre layouts diferentes…

    ResponderResponder
  12. |

    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.

    ResponderResponder
  13. |

    @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.

    ResponderResponder

Deixe um comentário