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:
- Escreva modelos de Blade e renderize seu aplicativo no lado do servidor
- 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:
- Qualquer pessoa pode criar uma conta e fazer login
- Usuários conectados podem criar e atualizar suas próprias postagens
- 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 php class Alert extends Component { public $ message="Nossa mensagem de alerta"; } //livewire/alert.blade.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:
php use Livewire \ Component; class PostAlert extends Component { public $ likes=true; public function render () { visualização de retorno ('livewire.post-alert'); } public function toggleLike () { $ this-> likes=! $ this-> likes; } } //livewire/post-alert.blade.phpVendo 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.
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
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
:
php namespace App; use Illuminate \ Database \ Eloquent \ Model; use Illuminate \ Database \ Eloquent \ SoftDeletes; classe Post extends Model { use SoftDeletes; protegido $ guardado=[]; autor de função pública () { return $ this-> 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 php namespace App \ Http \ Livewire; use Livewire \ Component; classe ListPost extends Component { função pública render () { $ posts=\ App \ Post:: latest ()-> paginate (20); visualização de retorno ('livewire.list-post', ['posts'=> $ posts]) -> extends ('layouts.app') -> seção ('conteúdo'); } } //livewire/list-post.blade.phpMinhas postagens Adicionar novo
@forelse ($ posts as $ post)
- @vazio
{{$ post-> título}}
{!! substr (strip_tags ($ post-> body), 0, 200) !!}
Publicado em {{$ post-> created_at}}- Você ainda não escreveu nenhuma postagem, escreva uma agora
@endforelse
Então, para criar uma postagem, usaremos isto:
//CreatePost.php php namespace App \ Http \ Livewire; use App \ Post; use Livewire \ Component; use Illuminate \ Support \ Str; 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; } }
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)@fim seA postagem foi criada com sucesso. Ver todas as postagens
Se você navegar em seu navegador para /posts/create
, deverá ver o formulário de criação exibido:
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 .