quarta-feira, 27 de maio de 2009

Zend Framework - Tutorial de sobrescrita do método preDispatch() do Zend_Controller_Action

O Zend_Controller_Action proporciona dois métodos que podem ser chamados a cada Action solicitada, o preDispatch() e o postDispatch(). Este métodos podem ser úteis de variadas maneiras, entre elas o controle de autenticação.

Este tutorial tem como objetivo exemplificar a utilização do método preDispatch() através da sobrescrita por uma classe extendida do Zend_Controller_Action.

No formulario criado pelo Zend_Form, como exemplo a seguir, setAction será atribuído com a baseUrl + Controller + Action:



$form = new Zend_Form();

$form->setAction($this->baseUrl.'/usuario/cadastrar')
->setMethod('post');

$form->addElement('text','username',array(
'validators' => array(
'alnum',
array('regex', false, '/^[a-z]/i')
),
'required' => true,
'filters' => array('StringToLower'),
));

$form->addElement('submit','Enviar');

echo $form->render();



Percebam que a baseUrl foi passada através de do atributo $this->baseUrl. Uma maneira de passar a baseUrl seria no UsuarioController, na cadastrarAction(), conter o seguinte comando:


$this->baseUrl = $this->getFrontController()->getBaseUrl();
$this->view->baseUrl = $this->baseUrl;


Desta maneira seria possível passar no formulário apenas $this->baseUrl. Porém em todos os Controllers e Actions deveria ter as duas linhas de comando acima. Para que isto não seja necessário devemos utilizar o método preDispatch() do Zend_Controller_Action. Aonde para cada Action chamada será executado o método em questão. Uma maneira de sobrescrever é criar uma classe genérica, em que todas os controllers deverão extender desta classe. A classe genérica deverá extender a classe Zend_Controller_Action.

GenericoController.php:



class GenericoController extends Zend_Controller_Action {

private $baseUrl;

/** Este método é uma sobrescrita do preDispatch() do Zend_Controller_Action
*
* @see app/zf/Zend/Controller/Zend_Controller_Action#preDispatch()
*
* Será executado antes de qualquer chamada a um Action do Controller
*
*/
public function preDispatch() {
$this->baseUrl = $this->getFrontController()->getBaseUrl();
$this->view->baseUrl = $this->baseUrl;
}

}


Espero ter ajudado!

Atenciosamente,
Rondson Lima

Nenhum comentário: