Utilizando Sessões no Zend Framework 2 – Parte 1

Atenção! Essa postagem foi escrita há mais de 2 anos. Na informática tudo evolui muito rápido e algumas informações podem estar desatualizadas. Embora o conteúdo possa continuar relevante, lembre-se de levar em conta a data de publicação enquanto estiver lendo. Caso tenha sugestões para atualizá-la, não deixe de comentar!

Zend Framework 2

Todos nós sabemos que o PHP implementa uma abordagem stateless para aplicações. O processo do PHP inicia, as variáveis são alocadas, informações são geradas e armazenadas e então, quando a requisição é finalizada, todo o estado é perdido. Todas as informações geradas durante a requisição são perdidas quando ela acaba.

Para driblar esse problema, foi introduzido no PHP o conceito de sessões que nos permite armazenar informações entre uma requisição e outra. No entanto, como na maioria das vezes, conforme as aplicações se tornam mais complexas, a habilidade de interagir com as sessões em uma maneira que supre a necessidade de aplicação cresceu também.

Felizmente, no Zend Framework 2, existe um conjunto de classes que auxilia na redução da complexidade do gerenciamento de informações na sessão, ou seja, podemos interagir, configurar ou armazenar sem distanciar muito o programador da implementação da aplicação ou então adicionar muita complexidade ao processo.

No artigo de hoje, o primeiro de dois, vamos ver como colocar pra funcionar uma configuração básica, assim você pode ter, hoje mesmo, sessões funcionando na sua aplicação ZF2.

Para o tutorial de hoje, vou assumir que você já possui uma versão implementada de projeto básico utilizando o ZF2Skeleton (esse tutorial ensina também como utilizar o ZfcUser, mas para nós, hoje, é irrelevante).

Nós vamos estender o módulo padrão Application para dar suporte a sessões ao resto da aplicação. Para integrar esse suporte, vamos precisar fazer três coisas:

  1. Atualizar o Module.php
  2. Criar um novo Container e armazenar alguns dados
  3. Recuperar os dados

Então vamos lá!

1. Atualizar o Module.php

Primeiramente, no module/Application/Module.php, nós precisamos fazer três coisas:

  • Adicionar duas declarações use
  • Criar uma nova função para inicializar a sessão
  • Chamar a função no onBootstrap

Então, adicione as seguintes declarações:

[php]use Zend\Session\Config\SessionConfig;
use Zend\Session\Container;[/php]

E depois vamos criar a seguinte função:

[php]public function initSession($config)
{
$sessionConfig = new SessionConfig();
$sessionConfig->setOptions($config);
$sessionManager = new SessionManager($sessionConfig);
$sessionManager->start();
Container::setDefaultManager($sessionManager);
}[/php]

initSession cria uma nova variável SessionConfig, que permite fornece as configurações para o gerenciador de sessão. Nós configuramos algumas opções e passamos como o único argumento ao instanciar um novo SessionManager. Finalmente chamamos o método estático setDefaultManager na classe Container, pasando a nova variável $sessionManager.

Vamos dar uma olhada mais de perto.

  • Container: Fornece a core interface para gerenciar os dados da sessão.
  • SessionConfig: Manipula configurações de várias opções da sessão.
  • SessionManager: Manipula o gerenciamento da sessão, ou seja, tarefas como inicializar, verificar a existência, regenerar id, time to live, destroy e até validação.

No onBootstrap, adicionamos o seguinte:

[php]$this->initSession(array(
‘remember_me_seconds’ => 180,
‘use_cookies’ => true,
‘cookie_httponly’ => true,
));[/php]

Assim podemos garantir que a sessão estará sempre configurada e pronta para uso. Com esse código no seu devido lugar, agora temos suporte a sessão disponível, utilizando cookies para guardar as informações da sessão, persistindo ela, depois que o browser é fechado, por 3 minutos.

2. Criar um novo Container e armazenar alguns dados

[php]$sessionTimer = new Container(‘timer’);
$sessionTimer->endTime = (float) array_sum(explode(‘ ‘, microtime()));[/php]

Maravilha, agora que já cuidamos da configuração, precisamos começar a gravar e usar informações na sessão. Então criamos um novo container de sessão chamado timer e nele colocamos o valor atual de microtime() em uma variable de container chamada endTime.

Containers são utilizados para darmos namespaces para as informações de sessão. Um namespace padrão está disponível, mas eu acho que, exceto em aplicações simples, essa não é a melhor abordagem. Então, conseguindo separar a informação, conseguimos tornar mais fácil o desenvolvimento semântico e programático da nossa aplicação.

3. Recuperar os dados

Bom, agora que a informação está gravada, vamos recuperá-la e utilizá-la. Então, em algum ponto da nossa aplicação, vou assumir que existe um controller action.

[php]$sessionTimer = new Container(‘timer’);
if ($sessionTimer && $sessionTimer->executionTime) {
return sprintf(
"Página renderizada em %s segundos.",
$sessionTimer->executionTime
);
}[/php]

Aqui, como quando configuramos as informações anteriores, nós utilizamos um objeto Container. Enquanto no primeiro exemplo o container não existia e seria criado, agora que ele já existe nós temos acesso a ele.

Agora, como a maioria das variáveis, nós podemos interagir com ela, verificando se a propriedade que estamos procurando, executionTime, está disponível. Se estiver, nós utilizamos um sprintf para mostrar as informações de maneira formatada.

Juntando tudo

E aqui estamos nós! Com apenas um pouquinho de trabalho a mais, já temos acesso a sessões do jeito do Zend Framework 2, com um pequeno toque de sofisticação – quer seja com as informações sendo armazenadas no backend, com a implementação de namespaces de sessão ou q quantidade de opções de configuração disponíveis. É uma biblioteca muito bacana que faz com que o trabalho com sessões fique muito mais simples.

No próximo tutorial vamos aprender como proteger as sessões contra session hijacking a partir dos validadores disponíveis e como utilizar armazenamento em diferentes backends como servidores de cache ou bancos de dados.

Espero que tenham gostado!

Um abraço a todos e fiquem com Deus.
Rafael Jaques

Adaptado do original de Matthew Setter: http://www.masterzendframework.com/sessions/using-sessions-in-zend-framework-2-part-1