[Zend Framework 2] – Método init()

Muitas coisas mudaram no Zend Framework desde que a Zend decidiu torná-lo totalmente dependente do PHP >=  5.3.x., e para utilizar a grande riqueza de recursos da orientação à objetos, muitas coisas do ZF1 foram aplicadas de forma completamente diferente e uma delas foi o método tão amável init().

Vamos ver como podemos obter o mesmo resultado no ZF2.

No ZF2 temos que olhar o framework sob o prisma de eventos e serviços. Se você não fizer isto, certamente não tirará proveito de seus recursos.

Li muitos artigos antigos falando sobre utilizar o construtor do Controller para obter o mesmo resultado, mas isto não é totalmente verdade, pois ele não retornará os objetos que somente são criados após o Controller é chamado, pois há muita coisa acontecendo no universo dos Eventos e Serviços.

A meu ver a melhor forma de simular o método init() é sobreescrevendo o método setServiceManager()  que por sua vez irá acessar diretamente a injeção de eventos no controller.

Para tal, precisamos invocar o método pai setEventManager() e uma vez que podemos utilizar o maravilhoso recurso de injeção de dependência do framework, vamos criar um evento onde iremos brincar com nosso controlador.

Acompanhe o código abaixo bem PHP 5.3-ista:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

// Carregamos o EventManagerInterface
use Zend\EventManager\EventManagerInterface;

class MyController extends AbstractActionController
{
    // Vamos sobreescrever o método setEventManager
    // e passar o EventManagerInterface como argumento
    public function setEventManager(EventManagerInterface $events)
    {
        // Invocamos o método da classe pai
        parent::setEventManager($events);

        // Para utilizarmos o objeto 
        // $this no lambda a seguir
        // precisamos passá-lo 
        // para outra variavel,
        // pois o PHP não aceitará 
        // $this como argumento
        $controller = $this;

        // Criamos um evento no dispatch
        $events->attach(
            'dispatch',
            function($e) use ($controller) {
                // Agora temos acesso ao 
                // framework dentro do evento
                // e podemos fazer o que estávamos 
                // habituados no init() do ZF1
                // Como definir um layout padrão 
                // para todo o controlador
                $controller->layout('layout/mylayout');
            },
            // Definindo o valor de 100 
            // garantirá que o evento
            // seja disparado antes das regras 
            // de negócio para das Ações
            // (ActionControllers)
            100
        );
        // $this agora contém o que precisamos
        return $this;
    }
}

Bom, poderíamos fazer isto de outras formas, mas não ficaria tão transparente.

Espero ter ajudado.

É isso ai! Abraço do Giba!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *