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.