-
Notifications
You must be signed in to change notification settings - Fork 3
Arquitetura MVC no Liquido
Neste artigo, exploraremos a arquitetura MVC (Modelo-Visão-Controlador, ou Model-View-Controller) e como ela é implementada no framework Liquido. A arquitetura MVC é um padrão de design amplamente utilizado no desenvolvimento de aplicações web, que divide a aplicação em três componentes principais: Modelo (Model), Visão (View) e Controlador (Controller). Essa divisão facilita a manutenção, escalabilidade e testabilidade do código.
Ao criar um projeto com o Liquido, a estrutura de diretórios é organizada da seguinte forma:
meu-projeto-liquido/
├── estilos/
├── modelos/
├── parciais/
├── publico/
├── rotas/
├── visoes/
├── .ambiente
└── configuracao.delegua
- estilos/: contém arquivos de estilos FolEs para a apresentação visual de páginas LMHT.
- modelos/: contém os arquivos que definem os modelos de dados.
- parciais/: contém componentes reutilizáveis da apresentação que podem ser incluídos em várias visões.
- publico/: contém arquivos estáticos, como imagens.
-
rotas/: contém os arquivos com extensão
.deleguaque definem as rotas da aplicação. - visoes/: contém os arquivos de apresentação do sistema, normalmente usando LMHT.
- .ambiente: arquivo de configuração do ambiente, onde são definidas variáveis de ambiente, como chaves secretas.
- configuracao.delegua: arquivo principal de configuração, onde o roteamento e outras configurações da aplicação são definidas.
A camada de Modelo é responsável pela descrição e persistência de dados, definindo as entidades e suas relações. No Liquido, o Modelo é implementado por meio de classes que representam as tabelas do banco de dados e suas propriedades. O framework oferece suporte para operações CLAE (Criar, Ler, Atualizar e Excluir, ou CRUD: Create, Read, Update, Delete em inglês) e facilita a interação com o banco de dados.
Uma entidade de dados, também chamada de Modelo, é uma classe em Delégua cujas propriedades representam porções de dados a serem registradas num banco de dados. Por exemplo, se queremos definir uma entidade de artigos para blogs, podemos fazer da seguinte forma:
classe Artigo {
id: numero
titulo: texto
conteudo: texto
}
Cada propriedade pode ser acrescida de decoradores, que definem comportamentos e validações adicionais. Mais informações sobre esses decoradores podem ser vistas no projeto delegua-entidades.
A camada de Visão é responsável pela apresentação dos dados ao usuário. No Liquido, visões são geradas através da definição dos modelos de dados, permitindo a inserção, modificação e exclusão dinâmica de dados. O framework suporta a utilização de LMHT e FolEs para a criação das interfaces web. Também é possível utilizar o recurso de Parciais, inspirado no Ruby on Rails, para reutilizar componentes de interface. Veja um exemplo simples de uma Visão em Liquido:
<lmht>
<cabeça>
<meta nome="description" conteudo="LMHT" />
<meta nome="keywords" conteudo="HTML, LMHT, Desenvolvimento, Web" />
<meta nome="author" conteudo="Leonel Sanches da Silva" />
<meta nome="viewport" conteudo="width=device-width, initial-scale=1.0" />
<titulo>Meu blog</titulo>
</cabeça>
<corpo>
<artigo>
<titulo1>Meu primeiro artigo</titulo1>
<p>Este é meu primeiro artigo.</p>
</artigo>
</corpo>
</lmht>
O Controlador é responsável por gerenciar a lógica de negócios e a interação entre o Modelo e a Visão. O Liquido utiliza o conceito de Rotas para mapear URLs para redirecionar, processar requisições e retornar respostas. As rotas são funções que recebem dois parâmetros: o objeto de requisição e o objeto de resposta. Veja um exemplo de definição de uma rota no Liquido:
liquido.rotaGet(funcao(requisicao, resposta) {
resposta.enviar("Teste com ID. ${requisicao.parametros.id}").status(200)
})
liquido.rotaGet: define uma rota que responde a requisições GET.
funcao(requisicao, resposta): Define uma função anônima que processa a requisição
resposta.enviar: envia uma resposta ao cliente.
requisicao.parametros.id: acessa o parâmetro id da requisição.
Podemos definir rotas para diferentes métodos HTTP, como GET, POST, PUT, DELETE, etc. Também é possível utilizar LinConEs para interagir com o banco de dados nas rotas. Veja um exemplo de uma rota que cria dois novos clientes:
liquido.rotaGet(funcao(requisicao, resposta) {
lincones.executar("CRIAR TABELA clientes (ID INTEIRO NAO NULO CHAVE PRIMARIA AUTO INCREMENTO, NOME TEXTO(100) NAO NULO)")
lincones.executar("INSERIR EM clientes (NOME) VALORES ('Pernalonga')")
lincones.executar("INSERIR EM clientes (NOME) VALORES ('Patolino')")
var teste = lincones.executar("SELECIONAR * DE clientes")
resposta.lmht({"linhas": teste[0].linhasRetornadas}).status(200)
})
Neste exemplo, a rota cria uma tabela clientes, insere dois registros e retorna os dados em formato LMHT. Note que o comando lincones.executar é usado para executar comandos SQL diretamente no banco de dados.