Zend_Controller
Como dito anteriormente, e depois de alguns dias parado, hoje volto a escrever no blog do projeto URLcurta! sobre o Zend_Controller, como este componente é o “coração” do sistema MVC do Zend Framework, é sempre bom conhecer e entender um pouco sobre esse design-pattern, se ainda não conheces, recomendo que dê uma lida neste link sobre MVC. Se ainda restar dúvidas, não se preocupe, a medida que vamos escrevendo códigos, vamos entendendo melhor esse pattern.
Sendo o Zend_Controller um componente com muitas funcionalidades, neste momento, vou apresentar apenas o básico, que é o que está sendo utilizado no projeto até o momento.
O inicio de tudo já foi até explicado superficialmente no post sobre a organização do projeto, tudo começa na estrutura, por isso, vou apenas copiar algumas partes que foram descritas lá.
Estrutura de diretórios:
../
../application
../application/default/controlers
../application/default/models
../application/default/views
../html
../html/images
../html/scripts
../html/styles
../html/index.php
../html/.htaccess
../library
Também faz parte do setup do Zend_Controller o arquivo .htaccess que contém algumas regras de re-escrita de URL.
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
O index.php é o nosso “pontapé” (bootstrap), todas as requisições são através dele.
<?php
/**
* @author Andre de Castro Zorzo
* @version
*/
set_include_path('.' . PATH_SEPARATOR . '../' . PATH_SEPARATOR . '../library' . PATH_SEPARATOR . './application/default/models/' . PATH_SEPARATOR . get_include_path());
require_once 'Zend/Controller/Front.php';
/**
* Setup controller
*/
$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory('../application/default/controllers');
$controller->throwExceptions(true); // XXX deixar ligado apenas enquanto estiver desenvolvendo
$controller->dispatch();
?>
Esse “$controller->setControllerDirectory(’…’)” indica o diretório onde estão as “controllers” do projeto. E o “$controller->dispatch()” é o responsável por procurar as “controllers” nesse diretório e “despachá-las”, (fazê-las rodar/executar).
Um pouquinho sobre como funciona o roteamento das urls.
A primeira parte da url indica qual “controller” chamar, e a segunda, qual “action”. Assim, http://urlcurta.com/cadastro/editar significa que “cadastro” é a nossa “controller” e “editar” a nossa “action”. Por padrão, quando não é informada uma “action”, o Zend Framework, assume a “index” como sendo a “action” da controller “cadastro”. E se não informar uma “controller”, por padrão o Zend Framework assumirá a controller “index”, exemplificando:
http://urlcurta.com/cadastro/editar (controller "cadastro", action "editar")
http://urlcurta.com/cadastro (controller "cadastro", action "index")
http://urlcurta.com (controller "index", action "index")
Pela definição que fizemos anteriormente, no arquivo “index.php”, nossas controllers estão no diretorio “application/default/controllers”.
Para o nome das controller e actions existe uma regra a ser seguida, por definição do Zend Framework, o nome de uma controller DEVE começar com letra maiúscula e terminar com a palavra “Controller” (a primeira em maiúscula também), por exemplo, “CadastroController.php“. Assim, temos os arquivos:
application/default/controllers/CadastroController.php
application/default/controllers/IndexController.php
Para “actions” a regra é, o nome seguido pela palavra “Action” (a primeira em maiúscula), por exemplo “editarAction”.
É possivel definir nomes compostos para controllers e actions, porém, você deve observar um detalhe, digamos que a controller seja: “TermosDeUsoController.php”, para isso funcionar corretamente, você deverá chamar na url: http://urlcurta.com/termos-de-uso, se tentar usar http://urlcurta.com/termosDeUso vai dar erro e não vai funcionar.
Agora vamos ver o código da controller “CadastroController.php”
<?php
/**
* CadastroController
*
* @author Andre de Castro Zorzo <andre_zorzo@yahoo.com>
* @version
*/
require_once 'Zend/Controller/Action.php';
class CadastroController extends Zend_Controller_Action
{
public function indexAction()
{
}
public function editarAction()
{
}
}
E o IndexController.php está assim
<?php
/**
* IndexController - The default controller class
*
* @author Andre de Castro Zorzo <andre_zorzo@yahoo.com>
* @version
*/
require_once 'Zend/Controller/Action.php';
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
}
}
Além disso, temos um “action helper” chamado ViewRenderer que está ativo por padrão, isso significa, que o simples fato de criar uma “action” e um arquivo html (view) o conteúdo deste arquivo de “view” já será apresentado. Mais um componente que está ativo por padrão, e que é a parte da camada MVC é o Zend_View. Para determinar o nome da view correspondente, o ViewRenderer através do nome da controller e da action descobre qual é template (view/codigo html). A extensão padrão dos templates é “.phtml”, assim, a url http://urlcurta.com/cadastro/editar vai utilizar o template que fica no diretório:
application/default/view/scripts/cadastro/editar.phtml
<html>
<title>Projeto URLcurta!</title>
<body>
<h1>Editar Cadastro</h1>
</body>
</html>
Basicamente é isso o Zend_Controller. Nos próximos posts provavelmente abordarei mais um pouco de Zend_Controller. Qualquer duvida, é só falar!
