Symfony 4.1: Melhorias na Sessão

Alguns usos de Request::getSession() foram descontinuados

Andréia Bohner
2 min readApr 29, 2018

O uso de Request::getSession()quando nenhuma sessão existe foi descontinuado no Symfony 4.1 e lançará uma exceção no Symfony 5.0. A solução é sempre verificar primeiro se existe uma sessão com o método Request::hasSession():

// ...
if ($request->hasSession() && ($session = $request->getSession())) {
$session->set('some_key', 'some_value');
}

Permitir o cache de requisições que usam sessões

Sempre que a sessão é iniciada durante uma requisição, o Symfony transforma a resposta em uma resposta privada não-cacheável para evitar o vazamento de informações privadas. No entanto, até mesmo requisições usando sessão podem ser armazenadas em cache em algumas circunstâncias.

Por exemplo, informações relacionadas a algum grupo de usuários podem ser armazenadas em cache para todos os usuários pertencentes a esse grupo. O manuseio desses cenários avançados de armazenamento em cache está fora do escopo do Symfony, mas eles podem ser resolvidos com o FOSHttpCacheBundle.

Para desabilitar o comportamento padrão do Symfony que torna as requisições usando sessão não-cacheáveis, no Symfony 4.1 foi adicionado o cabeçalho NO_AUTO_CACHE_CONTROL_HEADER que você pode adicionar às respostas:

use Symfony\Component\HttpKernel\EventListener\AbstractSessionListener;

$response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, 'true');

Permitir a migração de sessões

A migração de sessões (por exemplo, do sistema de arquivos para o banco de dados) é uma operação complicada que geralmente acaba perdendo todas as sessões existentes. É por isso que no Symfony 4.1 foi adicionada uma nova classe MigratingSessionHandler para permitir a migração entre handlers de salvamento antigos e novos sem perder os dados da sessão.

É recomendado fazer a migração em três etapas:

use Symfony\Component\HttpFoundation\Session\Storage\Handler\MigratingSessionHandler;

$oldSessionStorage = ...;
$newSessionStorage = ...;

// The constructor of the migrating class are: MigratingSessionHandler($currentHandler, $writeOnlyHandler)
// Step 1. Do this during the "garbage collection period of time" to get all sessions in the new storage
$sessionStorage = new MigratingSessionHandler($oldSessionStorage, $newSessionStorage);

// Step 2. Do this while you verify that the new storage handler works as expected
$sessionStorage = new MigratingSessionHandler($newSessionStorage, $oldSessionStorage);

// Step 3. Your app is now ready to switch to the new storage handler
$sessionStorage = $newSessionStorage;

Tradução de: New in Symfony 4.1: Session improvements

--

--