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.edgeAbra 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 --devFinalmente, 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.
@endloggedInTudo 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: