Laravel Livewire é um framework Laravel full-stack para construção de interfaces dinâmicas. Em um passado não tão distante, para construir um aplicativo com o Laravel, você tinha que:

  1. Escreva modelos de Blade e renderize seu aplicativo no lado do servidor
  2. Escreva seu back-end como APIs que aceitam e respondem com JSON e, em seguida, tenha uma estrutura de front-end como Vue, React ou Angular para consumir as APIs e implementar a UI

Mas agora, temos uma terceira opção: Livewire. Eu adoraria aprofundar os prós e os contras das opções 1 e 2 acima, mas isso já foi feito justiça em esta postagem bem escrita aqui .

Neste artigo, vamos mergulhar fundo no Livewire e ver como ele pode ser aplicado em aplicativos do mundo real.

O que construiremos

Criaremos um aplicativo de blog simples com os seguintes recursos:

  1. Qualquer pessoa pode criar uma conta e fazer login
  2. Usuários conectados podem criar e atualizar suas próprias postagens
  3. Qualquer pessoa pode ler postagens

Pré-requisitos e configuração

Este tutorial assume que você tem bastante experiência com o Laravel (observe que este tutorial usa o Laravel 7.x). Nenhuma experiência anterior com Livewire é necessária-acho que é por isso que estamos aqui de qualquer maneira.

Claro, para começar, precisamos ter nosso ambiente de desenvolvimento configurado. Primeiro, crie um novo aplicativo Laravel:

 composer create-project--prefer-dist laravel/laravel: ^ 7.0 blog-wire

Em seguida, instale o pacote Livewire com composer:

 composer requer livewire/livewire

Crie um novo banco de dados e adicione suas credenciais de banco de dados ao arquivo .env . E isso é tudo de que precisamos para começar “Livewiring”!

Como funciona o Livewire?

Antes de começar, é bom ter uma ideia de como o Livewire faz seu trabalho. Resumindo:

  • Livewire renderiza a saída do componente inicial para a página-sim, como o típico modelo Blade renderizado por servidor
  • Quando ocorre uma interação, o Livewire faz uma solicitação AJAX ao servidor com dados atualizados
  • O servidor renderiza novamente o componente e responde com HTML atualizado
  • O Livewire então muda de forma inteligente o DOM de acordo com o que mudou

Como você pode ver, é como ter seu front-end e back-end em um só lugar, sem a necessidade de repetir a lógica.

Conceitos chave no Livewire

Ativando Livewire em uma página

Para fazer o Livewire funcionar em uma página, você precisa incluir os estilos e scripts do Livewire em cada página que precisar deles. Normalmente, eles iriam para o seu modelo base. Você faria isso usando @livewireStyles e @livewireScripts :

//app.blade.php


     @yield ('title')  @livewireStyles

 @yield ('conteúdo') @livewireScripts


Componentes Livewire

O Livewire faz tudo de bom em torno de seus componentes. Os componentes Livewire são bastante semelhantes aos componentes baseados em classes do Laravel Blade. Vamos dar uma olhada rápida nos dois.

Criando um componente Laravel Blade

Você criaria um componente Laravel Blade executando o seguinte comando:

 php artisan make: componente Alert

Isso criará um novo arquivo de classe Alert.php e o colocará na pasta App \ Views \ Components . Em seguida, um modelo de visão correspondente é criado e colocado em resources/views/components . Para exibir o componente, você pode usar esta sintaxe Blade: .

Você pode explorar mais os componentes do Laravel Blade na documentação .

Criação de um componente Livewire

Para criar um componente Livewire, execute o seguinte comando:

 php artisan make: livewire Alert

O comando também criará dois novos arquivos: app \ Http \ Livewire \ Alert.php e um modelo de visualização resources/views/livewire/alert.php .

Você pode renderizar um componente Livewire usando ou @livewire ('alert') .

Como você pode ver, os comandos são bastante semelhantes. A única grande diferença é que, com os componentes Livewire, há uma sincronização em tempo real (nenhuma atualização de página necessária) entre a classe do componente e seu modelo de visualização Veremos como isso funciona em breve.

Propriedades Livewire

As propriedades públicas em suas classes de componentes são disponibilizadas para a visualização do modelo do componente. Não para por aí-o valor da propriedade é sincronizado em tempo real com a vista da propriedade, de forma que quando você atualiza o valor da propriedade na vista, ele é atualizado automaticamente na classe do componente.

//App\Http\Livewire\Alert.php
  
{{$ message}}

Para vincular uma propriedade de componente a um elemento de entrada html, você usaria o seguinte sintaxe:

 wire: model="nome da propriedade"

Ao digitar na caixa de entrada, você verá o valor de $ message sendo atualizado em tempo real. Isso é muito semelhante ao conceito de vinculação de dados em estruturas como Vue.js, React e Angular. Saiba mais sobre as propriedades Livewire aqui .

Ações Livewire

Assim como você pode vincular dados no modelo de visualização a propriedades públicas de componentes, você também pode mapear eventos do lado do cliente para métodos em seus componentes. Por exemplo, você pode responder a eventos de clique, eventos keyup e keydown etc. usando métodos definidos em sua classe de componente.

Vejamos um exemplo:

  likes=! $ this-> likes; }
} //livewire/post-alert.blade.php

Vendo a ação livewire em ação & # x1f61c;

@if ($ gostou) @outro @fim se

Na classe de componente acima, criamos um método toggleLike () que alterna o valor da propriedade likes para seu valor booleano oposto. Na visualização do modelo, temos um botão e um ícone de coração que é colorido de vermelho ou cinza com base no valor da propriedade likes .

Usamos a sintaxe wire: click=[action name] para vincular o método toggleLike ao evento de clique.

Livewire Action ToggleLike Event
Ação Livewire alternando um botão.

Muitos casos de uso do Livewire giram em torno de propriedades e ações e, como tal, são muito importantes para entender. Esses conceitos podem ser aplicados a coisas como criar formulário , editar formulário , excluir formulário , etc. Leia mais sobre ações Livewire aqui .

Validação de dados

O Livewire torna a validação de dados perfeita. Para validar os dados vindos de uma visão de modelo de formulário, você deve escrever uma propriedade $ rules que contém suas regras de validação, assim como faria no Laravel. Depois disso, você chama $ this → validate () no método que faz a validação.

Vejamos um formulário para criar uma postagem no blog:

...
classe CreatePost extends Component
{ public $ title, $ body; public $ success; protegido $ rules=[ 'title'=>'obrigatório | string | max: 220', 'body'=>'obrigatório' ]; função pública render () { visualização de retorno ('livewire.create-post') -> extends ('layouts.app') -> seção ('conteúdo'); } public function create () { $ this-> validate (); Post:: criar ([ 'título'=> $ this-> título, 'slug'=> Str:: slug ($ this-> título), 'body'=> $ this-> body, 'author_id'=> auth ()-> id () ]); $ this-> sucesso=verdadeiro; }
} //livewire/create-post
@if ($ sucesso)
A postagem foi criada com sucesso
@fim se
@error ('title') {{$ message}} @enderror
@error ('body') {{$ message}} @enderror

No código do formulário acima, quando o usuário envia a postagem, e ela não passa na validação, os erros de validação são exibidos, tudo sem uma atualização da página.

Primeiros passos com Laravel Livewire

Já disse o suficiente-vamos entrar em ação. Você pode acompanhar no repositório GitHub enquanto construímos nosso aplicativo de demonstração.

Como queremos que os usuários conectados possam gerenciar suas próprias postagens, eles devem primeiro criar uma conta. Usaremos o sistema de autenticação integrado do Laravel para isso.

Primeiro, instale o pacote laravel/ui composer:

 compositor requer laravel/ui

Em seguida, execute php artisan ui vue--auth para fazer o scaffold de todo o sistema de autenticação, seguido por php artisan migrate para fazer suas migrações de banco de dados.

N.B ., a maioria das coisas que costumávamos fazer com os controladores agora serão feitas com componentes Livewire.

Vamos continuar criando o modelo necessário para nosso aplicativo de postagens de blog, App \ Post :

  belongsTo (User:: class,'author_id','id'); }
}

Agora vamos criar nosso arquivo de migração,
php artisan make: migration create_posts_table-table=posts:

 Schema:: create ('posts', function (Blueprint $ table) { $ tabela-> id (); $ tabela-> string ('título'); $ table-> string ('slug')-> unique (); $ table-> longText ('body'); $ table-> integer ('author_id'); $ table-> timestamps (); $ tabela-> softDeletes ();
});

Criação de componentes

Estaremos criando um componente para cada ação do blog que desejamos, ou seja, criar postagem, editar postagem, listar postagens e visualizar postagem. Vamos continuar e criar os componentes:

  • php artisan make: livewire CreatePost
  • php artisan make: livewire EditPost
  • php artisan make: livewire ListPost
  • php artisan make: livewire HomePost
  • php artisan make: livewire ReadPost

Podemos renderizar um componente Livewire diretamente de rotas como esta:

 Route:: get ('/posts/create', [\ App \ Http \ Livewire \ CreatePost:: class,'__invoke'])-> middleware ('auth');

Em vez de chamar as ações do controlador, iremos rotear para os componentes Livewire, como mostrado acima. Vamos agora adicionar todas as rotas de que precisamos em web.php :

 Route:: get ('/', function () { visualização de retorno ('índice');
});
Auth:: routes ();
Route:: get ('/post/{slug}', [\ App \ Http \ Livewire \ ReadPost:: class,'__invoke']);
Route:: get ('/home','HomeController @ index')-> nome ('home');
Route:: get ('/posts/create', [\ App \ Http \ Livewire \ CreatePost:: class,'__invoke'])-> middleware ('auth');
Route:: get ('/posts/{id}/edit', [\ App \ Http \ Livewire \ EditPost:: class,'__invoke'])-> middleware ('auth');

O componente para renderizar a lista de artigos terá a seguinte aparência:

//ListPost.php
 paginate (20); visualização de retorno ('livewire.list-post', ['posts'=> $ posts]) -> extends ('layouts.app') -> seção ('conteúdo'); }
} //livewire/list-post.blade.php

Minhas postagens Adicionar novo

    @forelse ($ posts as $ post)
  • {{$ post-> título}}

    {!! substr (strip_tags ($ post-> body), 0, 200) !!}

    Publicado em {{$ post-> created_at}}
  • @vazio
  • Você ainda não escreveu nenhuma postagem, escreva uma agora
  • @endforelse

Então, para criar uma postagem, usaremos isto:

//CreatePost.php
'obrigatório | string | max: 220', 'body'=>'obrigatório' ]; função pública render () { visualização de retorno ('livewire.create-post') -> extends ('layouts.app') -> seção ('conteúdo'); } public function create () { $ this-> validate (); Post:: criar ([ 'título'=> $ this-> título, 'slug'=> Str:: slug ($ this-> título), 'body'=> $ this-> body, 'author_id'=> auth ()-> id () ]); $ this-> sucesso=verdadeiro; }
}

No componente acima, criamos variáveis ​​públicas para conter o título e o conteúdo do corpo de uma postagem do blog, bem como uma variável sucesso para indicar se a criação da postagem foi bem-sucedida.

No método render () , Livewire nos permite especificar o arquivo de layout a ser usado na renderização do componente e a seção onde queremos que ele seja exibido por meio do extends () e section () , respectivamente.

Agora, a visualização do modelo se parece com isto:

 
@if ($ sucesso)
A postagem foi criada com sucesso. Ver todas as postagens
@fim se
@error ('body') {{$ message}} @enderror

Se você navegar em seu navegador para /posts/create , deverá ver o formulário de criação exibido:

Exibição do formulário de criação

Este é um exemplo bastante básico de como o Livewire pode ser aplicado no mundo real.

Conclusão

O Livewire preenche a lacuna entre o back-end e o front-end. Você obtém o benefício da interatividade em tempo real sem ter que escrever muito JavaScript sozinho. Se você já usou o Vue.js antes, é muito fácil ver os benefícios do Livewire.

O Livewire não é uma ótima escolha para aplicativos que exigem muito do cliente. Mas em situações em que você deseja um aplicativo renderizado por servidor com uma pitada de reatividade, o Livewire o atenderá bem.

Novamente, o aplicativo que desenvolvemos neste tutorial pode ser encontrado em G it H ub .

A postagem Mergulho profundo no Laravel Livewire apareceu primeiro em LogRocket Blog .

Source link