Sessões
O AdonisJs tem suporte pronto para uso para salvar sessões de longa duração em uma única sessão de solicitação chamada Flash Messages. Além disso, você pode escolher entre um dos drivers disponíveis para salvar os dados da sessão.
OBSERVAÇÃO
Para manter seu cookie de sessão criptografado, certifique-se de definir APP_KEY
dentro do arquivo .env. Como alternativa, você pode usar o comando ./ace key:generate
para gerar a chave para você.
Drivers
Abaixo está a lista de drivers disponíveis.
- Cookie (cookie).
- Arquivo (file).
- Redis (redis).
OBSERVAÇÃO
Certifique-se de configurar o provedor Redis antes de usar o driver redis.
Configuração
Dê uma olhada no link do arquivo de configuração de exemplo: https://github.com/adonisjs/adonis-app/blob/develop/config/session.js[arquivo de configuração de exemplo].
const Env = use('Env')
module.exports = {
// as opções disponíveis são arquivo, cookie, redis
driver: Env.get('SESSION_DRIVER', 'cookie'),
// configurações para qualquer driver que você escolher
redis: Env.get('REDIS_URL', 'redis://localhost:6379'),
cookie: 'adonis-session',
file: {
directory: 'sessions'
}
// outras configurações
age: 120,
clearWithBrowser: false,
httpOnly: true,
sameSite: true,
domain: null,
path: '/',
secure: false,
}
Exemplo básico
Vamos percorrer um exemplo básico de salvar/ler itens do carrinho para um determinado usuário da sessão.
Route.get('carts', function * (request, response) {
const cartItems = []
yield request.session.put('cart-items', cartItems)
yield response.send('Items added to cart successfully')
})
Métodos
Abaixo está a lista de métodos de sessão disponíveis.
put(key, value)
Adicione um valor ao armazenamento da sessão.
Route.post('users', function * (request, response) {
yield request.session.put('username', 'doe')
// ou
yield request.session.put({ username: 'doe' })
})
get(key, [defaultValue])
Retorna o valor para uma determinada chave. Ele retornará o defaultValue quando o valor real for null
ou undefined
.
Route.get('users/current', function * (request, response) {
const username = yield request.session.get('username')
// ou
const userId = yield request.session.get('userId', 123)
})
all
Retorna todos os valores da sessão como um objeto
const sessionValues = yield request.session.all()
forget(key)
Remove o valor de uma determinada chave
yield request.session.forget('name')
pull(key, [defaultValue])
Obtém e remove o valor de uma determinada chave. Pense nisso como chamar get e forget juntos.
const username = yield request.session.pull('username')
Mensagens Flash
Mensagens Flash são usadas para definir uma sessão de curta duração para uma única solicitação. É útil quando você deseja redirecionar o usuário de volta com os erros do formulário e valores existentes do formulário para que ele não precise digitar tudo novamente e apenas corrigir os erros.
Apenas certifique-se de que o middleware Flash
seja adicionado à lista de middleware global.
// app/Http/kernel.js
const globalMiddleware = [
// ...
'Adonis/Middleware/Flash'
// ...
]
Uso básico de mensagens Flash
Vamos trabalhar no fluxo de erros de validação de flash com a entrada do formulário e ver como podemos capturá-los dentro da nossa visualização.
// app/Http/routes.js
Route.on('users/create').render('users.create')
Route.post('users', 'UsersController.store')
// app/Http/Controllers/UsersController.js
'use strict'
class UsersController {
* store (request, response) {
const validation = yield Validator.validate(request.all(), rules)
if (validation.fails()) {
yield request
.withAll() <1>
.andWith({errors: validation.messages()}) <2>
.flash()
response.redirect('back')
}
}
}
- O método
withAll
adicionará todos os valores de solicitação ao armazenamento de sessão flash. - O método
andWith
é um auxiliar para flashear objetos de dados personalizados. Aqui, o usamos para flashear os erros de validação.
<!-- resources/views/users/create.njk -->
{% for error in old('errors') %} <1>
<li> {{ error.message }} </li>
{% endfor %}
{{ form.open({action: 'UsersController.store'}) }}
{{ form.text('email', old('email')) }}
{{ form.password('password', old('password')) }}
{{ form.submit('Create Account') }}
{{ form.close() }}
- O método
old
dentro das visualizações é usado para buscar valores para uma determinada chave das mensagens flash.
Métodos Flash
Abaixo está a lista de métodos para definir mensagens flash.
withAll
Irá piscar tudo de request.all()
.
yield request.withAll().flash()
withOnly(keys...)
Piscará valores somente para chaves definidas.
yield request.withOnly('email').flash()
withOut(keys...)
Piscará tudo, exceto chaves definidas.
yield request.withOut('password').flash()
with(values)
Piscará um objeto personalizado.
yield request.with({ error: 'Please fill in all details' }).flash()
andWith(values)
Método encadeável para enviar objeto personalizado com dados de solicitação.
yield request
.withAll()
.andWith({ error: 'Please fill in all details' })
.flash()
Acessando valores Flash
Você pode acessar os valores de mensagens flash dentro de suas visualizações usando os auxiliares definidos. Se não houver nada na mensagem flash na chave solicitada, ela exibirá o defaultValue.
old(chave, valorpadrão)
{{ old('username', user.username) }}
{# or #}
{{ old('profile.username') }}
flashMessages
{% for key, message in flashMessages %}
{{ message }}
{% endfor %}