Como utilizar sessões no Laravel

Vemos nesse artigo o essencial para manipulação de sessões e suas configurações.

 Escrevendo testes automatizados com PHPUnit

Sessões são informações armazenadas no servidor que podem ser consultados a qualquer momento, uma das suas vantagens é a facilidade em gerência-las. Por outro lado, devemos tomar cuidado com a quantidade de informação salvas, dando preferência para informações que se referem a uma ação ou estado o usuário, já que seu armazenamento pode ficar lento ou indisponível em um alto volume.

Quando criamos uma sessão no servidor, automaticamente um Cookie é gerado no cliente, pois como o protocolo HTTP não tem estado, o servidor não sabe qual sessão pertence a qual cliente, sendo assim, a cada nova requisição, o Session id é enviado para o servidor.

Em sistema grandes como lojas virtuais e sites de multimédia, o volume de armazenamento é tão alto que é necessário servidores apenas para gerenciar essas informações.

Configurando sessões no Laravel

O arquivo de configuração de sessão é armazenado em config/session.php. Por padrão o driver file já está atribuído, ele nos diz como as informações serão armazenadas, conheça algumas das opções disponíveis:

  • file - as sessões são armazenadas em storage/framework/sessions, esse é o valor padrão.;
  • cookie - as sessões são armazenadas em cookies criptografados seguros;
  • database - as sessões são armazenadas em um banco de dados relacional;
  • memcached/redis - as sessões são armazenadas em um armazenamentos rápidos baseados em cache;
  • dynamodb - as sessões são armazenadas no AWS DynamoDB;
  • array - as sessões são armazenadas em um array PHP e não serão persistidas.

Caso você precise modificar o tipo de armazenamento, basta alterar o driver como mostra o código a seguir.

'driver' => env('SESSION_DRIVER', 'file'),

Vale lembrar que também é possível definir o valor no .ENV, como mostra o exemplo abaixo.

SESSION_DRIVER=file

Definindo as rotas da aplicação

Antes de mais nada, vamos registrar as nossas rotas, assim cada uma delas irá executar uma ação diferente. Veja abaixo a rota e o método de ação na classe SessaoController.

Route::prefix('sessao')->group(function () {
    route::get('/criar', [SessaoController::class, 'criar']);
    route::get('/ler', [SessaoController::class, 'ler']);
    route::get('/verifica', [SessaoController::class, 'verifica']);
    route::get('/remove', [SessaoController::class, 'remove']);
});

Vamos acessar da seguinte forma cada uma das nossas rotas:

  • Criar - http://localhost:8000/sessao/criar
  • Ler - http://localhost:8000/sessao/ler
  • Verificar se existe - http://localhost:8000/sessao/verifica 
  • Remover- http://localhost:8000/sessao/remove

Utilizando o Helper Session

Para o nosso primeiro exemplo, vamos utilizar a função de helper session, ela nos prove alguns métodos interessantes, que são eles:

  • put - Cria uma nova sessão, basta informar a chave no primeiro parâmetro e o seu valor no segundo;
  • get - Obtém um valor de sessão, bata passar o nome da chave como parâmetro;
  • has - Verifica se uma sessão existe, basta passar o nome da chave com o parâmetro;
  • remove - Como o nome já deixa claro, remove uma sessão quando uma chave é informada.

Vamos ver agora os quatro exemplos acima de forma prática.

class SessaoController extends Controller
{
    public function criar()
    {
        session()->put('usuario_id', '123');
    }

    public function ler()
    {
        echo session()->get('usuario_id');
    }

    public function verifica()
    {
        if(session()->has('usuario_id')){
            echo 'Existe!';
        }else{
            echo 'Não existe!';
        }
    }

    public function remove()
    {
        session()->remove('usuario_id');
    }
}

Utilizando a classe Request

O exemplo acima é limpo e funcional, mas agora vamos ver outra abordagem que segue a utilização das funções acima, o que muda é que vamos assinar nossos método com a classe Resquest e acessar as sessões a partir delas.

class SessaoController extends Controller
{
    public function criar(Request $request)
    {
        $request->session()->put('usuario_id', '123');
    }

    public function ler(Request $request)
    {
        echo $request->session()->get('usuario_id');
    }

    public function verifica(Request $request)
    {
        if($request->session()->has('usuario_id')){
            echo 'Existe!';
        }else{
            echo 'Não existe!';
        }
    }

    public function remove(Request $request)
    {
        $request->session()->remove('usuario_id');
    }
}

Existem outros métodos bem interessantes, como o all() para retornar todas as sessões existentes.

$request->session()->all();

Para saber se um item existe na sessão atual, utilizamos o método exists() mesmo que não fornecemos a sua chave.

if ($request->session()->exists('users')) {
    //
}

Agora se você quer saber se um item não existe, para isso utilize o método missing() passando o nome da informação.

if ($request->session()->missing('users')) {
    //
}

Para criar um novo registro a gente viu o método put, mas também podemos fornecer a chave e valor na função session.

session(['key' => 'value']);

Além dos vários outros métodos existentes, vamos ver o último, que é o método pull(), ele obtém um registro e automaticamente já remove a sessão. Note que no segundo parâmetro informação um valor default caso a sessão não exista.

$request->session()->pull('key', 'default');

Como tudo no Laravel, utilizar sessões também é um processo tranquilo e rápido. 

Para aprender a trabalhar com Flash Session, veja nosso artigo Redirect com Flash Session no Laravel.

Vou ficando por aqui, nos vemos no próximo artigo.