Visualizações
O AdonisJs usa Edge como seu mecanismo de criação de modelos, que é incrivelmente rápido e vem com uma API elegante para criar visualizações dinâmicas.
Por baixo dos panos, o Edge suporta:
- Layouts e parciais
- Componentes
- Depuração em tempo de execução usando ferramentas de desenvolvimento do Chrome
- Tags lógicas e tudo mais
Exemplo básico
Vamos começar com o exemplo clássico Hello World renderizando um modelo do Edge.
OBSERVAÇÃO
Certifique-se de que o ViewProvider
do AdonisJs esteja registrado como um provedor dentro do seu arquivo start/app.js
.
// .start/app.js
const providers = [
'@adonisjs/framework/providers/ViewProvider'
]
Todas as visualizações são armazenadas no diretório resources/views
e terminam com a extensão .edge
.
Use o comando adonis
para criar a visualização:
adonis make:view hello-world
# .make:view output
✔ create resources/views/hello-world.edge
Abra hello-world.edge
e salve seu conteúdo como:
<h1>Hello World!</h1>
Agora, crie uma rota para renderizar a visualização hello-world.edge
:
// .start/routes.js
Route.get('hello-world', ({ view }) => {
return view.render('hello-world')
})
O método view.render
pega o caminho relativo resources/views
para o arquivo de visualização. Não há necessidade de digitar a extensão .edge
.
Se você ainda não fez isso, sirva seu site:
adonis serve --dev
Finalmente, navegue até 127.0.0.1:3333/hello-world
e você deverá ver:
"Hello World!"
Visualizações aninhadas
Você também pode renderizar visualizações de dentro de subpastas por meio da notação de ponto:
// file path: resources/views/my/nested/view.edge
view.render('my.nested.view')
Solicitar informações
Todas as visualizações têm acesso ao objeto request
atual.
Você pode chamar métodos de solicitação dentro de seus modelos de visualização como:
The request URL is {{ request.url() }}
O valor request.url
acima também pode ser recuperado por meio do global url
:
The request URL is {{ url }}
Globals
Além de todos os Edge globals, os seguintes globais também são fornecidos pelo AdonisJs.
style
Adiciona uma tag link
a um arquivo CSS.
Caminho relativo (para arquivos CSS no diretório public
):
{{ style('style') }}
<link rel="stylesheet" href="/style.css" />
Caminho absoluto:
{{ style('https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css') }}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" />
script
Adiciona uma tag script
a um arquivo JavaScript.
Caminho relativo (para arquivos JavaScript no diretório public
):
{{ script('app') }}
<script type="text/javascript" src="/app.js"></script>
Caminho absoluto:
{{ script('https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js') }}
<script type="text/javascript" src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
assetsUrl
Retorna o caminho de um arquivo relativo ao diretório public
:
<img src="{{ assetsUrl('images/logo.png') }}" />
<img src="/images/logo.png" />
route
Retorna a URL para uma rota.
Por exemplo, usando a seguinte rota de exemplo...
// .start/routes.js
Route.get('users/:id', 'UserController.show')
.as('profile')
...se você passar o nome da rota e quaisquer parâmetros de rota...
<a href="{{ route('profile', { id: 1 }) }}">
View profile
</a>
...a URL da rota será renderizada assim:
<a href="/users/1">
View profile
</a>
Você também pode passar a assinatura controller.method
:
<a href="{{ route('UserController.show', { id: 1 }) }}">
View profile
</a>
url
Retorna a URL da solicitação atual:
The request URL is {{ url }}
auth
Se estiver usando o AdonisJs Auth Provider, você pode acessar o usuário conectado atual por meio do objeto global auth
:
{{ auth.user }}
CSRF
Se estiver usando o AdonisJs Shield Middleware, você pode acessar o token CSRF e o campo de entrada usando um dos seguintes globais.
csrfToken
{{ csrfToken }}
csrfField
{{ csrfField() }}
<input type="hidden" name="_csrf" value="...">
cspMeta
Usando o AdonisJs Shield Middleware, os cabeçalhos CSP são definidos automaticamente.
No entanto, você também pode defini-los manualmente por meio do cspMeta
global:
<head>
{{ cspMeta() }}
</head>
Tags
Tags são os blocos de construção para modelos do Edge.
Por exemplo, @if
, @each
e @include
são todas tags enviadas com o Edge por padrão.
O Edge também expõe uma API muito poderosa para adicionar novas tags a ele.
Aqui está uma lista das tags
específicas apenas para o AdonisJs.
loggedIn
A tag loggedIn
permite que você escreva uma cláusula condicional if/else
em torno do usuário conectado.
Por exemplo:
@loggedIn
You are logged in!
@else
<a href="/login">Click here</a> to login.
@endloggedIn
Tudo entre as tags @loggedIn
e @else
é renderizado se o usuário estiver logado, enquanto tudo entre as tags @else
e @endloggedIn
é renderizado se não estiver.
inlineSvg
Renderiza um arquivo SVG inline dentro do seu HTML.
A tag espera um caminho relativo para um arquivo SVG dentro do diretório public
:
<a href="/login">
@inlineSvg('lock')
Login
</a>
Modelos
O AdonisJs compartilha sua sintaxe de modelos com o Edge.
Leia o Edge Guia de sintaxe para mais informações.
Estendendo visualizações
Também é possível estender visualizações adicionando seus próprios globais de visualização ou tags.
NOTA
Como o código para estender View
precisa ser executado apenas uma vez, você pode usar providers ou Ignitor hooks para fazer isso. Leia (/docs/06-Digging-Deeper/03-Extending-the-Core.md) para mais informações.
Globais
const View = use('View')
View.global('currentTime', function () {
return new Date().getTime()
})
O global acima retorna o tempo atual quando referenciado dentro de suas visualizações:
{{ currentTime() }}
Escopo de globais
O valor de this
dentro do fechamento de um global é vinculado ao contexto da visualização para que você possa acessar valores de tempo de execução a partir dele:
View.global('button', function (text) {
return this.safe(`<button type="submit">${text}</button>`)
})
DICA
O método safe
garante que o HTML retornado não seja escapado.
Para usar outros globais dentro de seus globais personalizados, use o método this.resolve
:
View.global('messages', {
success: 'This is a success message',
warning: 'This is a warning message'
})
View.global('getMessage', function (type) {
const message = this.resolve('messages')
return messages[type]
})
{{ getMessage('success') }}
Tags
Você pode aprender mais sobre tags por meio da documentação do Edge.
const View = use('View')
class MyTag extends View.engine.BaseTag {
//
}
View.engine.tag(new MyTag())
Valores de tempo de execução
Você pode querer compartilhar valores de solicitação específicos com suas visualizações.
Isso pode ser feito criando middleware e compartilhando locais:
class SomeMiddleware {
async handle ({ view }, next) {
view.share({
apiVersion: request.input('version')
})
await next()
}
}
Então, dentro de suas visualizações, você pode acessá-lo como qualquer outro valor:
{{ apiVersion }}
Destaque de sintaxe
Os seguintes plug-ins de editor fornecem suporte ao destaque de sintaxe do Edge: