Olá caro leitor, seja bem-vindo ao tutorial de como desenvolver um CRUD utilizando o Framework PHP Laravel. A sigla CRUD representa os quatro verbos básicos de interação com o banco de dados: Create, Read, Update, Delete (Criar, Ler, Atualizar, Deletar), e neste tutorial faremos exatamente isso, criamos um registro no banco de dados para que possamos buscá-lo para visualização e edição, e em seguida efetuaremos a sua exclusão, tudo isso utilizando as ferramentas do Laravel.
Então… Mãos à obra!
- 1 – Requisitos
Antes de qualquer coisa precisamos atender aos requisitos básicos para conseguir rodar o Laravel sem problemas. Se você acessar a documentação oficial do Laravel vai encontrar a seguinte lista de requisitos:
Para atender a todos esses requisitos basta instalar o xampp, um pacote de fácil instalação que contem o Apache, o PHP e o Banco de Dados. Acesse o site oficial do xampp e realize o download adequado ao seu sistema operacional.
- 2 – Instalando o Laravel
Com os requisitos devidamente atendidos chegou a hora de instalar o Laravel, e para isso utilizaremos o gerenciador de pacotes composer. Basta entrar no site oficial do composer, realizar o download e instalar.
Com o composer devidamente instalado abra um terminal no seu diretório de preferência e digite o seguinte comando:
composer create-project --prefer-dist laravel/laravel crud_basico
Aguarde o final do processo de instalação, e no mesmo terminal acesse o diretório raiz do projeto Laravel que acabou de criar
cd crud_basico/
- 3 – Configurando o Banco de Dados
Com o projeto laravel devidamente instalado, no diretório raiz você encontrará o arquivo .env, abra no seu editor de código de preferência e edite as informações contidas na linha 9 até a linha 14. Essas são as informações de conexão com o seu banco de dados, no meu caso as informações são as seguintes:
Se você já sabe como criar e administrar um banco de dados utilizando o XAMPP pule essa parte do tutorial, mas caso não sabia, basta abrir o painel de controle do XAMPP e iniciar o serviço do Apache e do MySQL.
E sem seguida, em seu navegador de preferência, acesse localhost/phpmyadmin, clique em Novo e digite o nome do seu novo banco de dados.
Atenção: Por padrão o Laravel utiliza o Agrupamento utf8_unicode_ci.
Com as informações devidamente preenchidas corretamente, clique em Criar.
Pronto, o banco de dados está configurado.
- 4 – Criando as tabelas no banco de dados
Com o banco de dados devidamente configurado chegou a hora de criarmos as primeiras tabelas. O Laravel já possui algumas migrations (arquivos de instrução para criação de tabelas) nativas, para acessá-las basta encontrar, a partir da raiz do projeto, o diretório database/migrations.
Existem duas migrations lá, mas por enquanto vamos dar foco a primeira migration, responsável pela criação da tabela de usuários.
Essa tabela, após criada, contará com os campos name, email, email_verified_at e password, além dos campos de token (para recuperação de senha) e registro de hora e data de criação e edição do registro.
O que nos interessa agora é saber como fazemos para que essa tabela seja efetivamente criada em nosso banco. O Laravel conta com uma poderosa ferramenta de linha de comando, o artisan, que facilita todo o nosso processo de desenvolvimento, desde criação de arquivos, testes unitários, execução de instruções e muitos outros recursos.
No seu terminal, na raiz do projeto, digite o seguinte comando:
php artisan migrate
Esse comando executa uma leitura, de cima para baixo, na pasta migrations e executa cada um dos arquivos.
Se o seu terminal está parecido ou igual ao meu, o processo de migração ocorreu sem erros, e para termos certeza disso podemos abrir novamente o nosso banco de dados (localhost/phpmyadmin) e verificar a existência das tabelas users e failed_jobs.
Perceba que uma terceira tabela foi criada, a tabela migrations. É um recurso nativo do Laravel que serve para registrar quais migrations já foram executadas para prevenir a tentativa de criação de uma tabela já existente, afinal de contas no dia a dia nós criaremos várias migrações que não serão necessariamente executadas ao mesmo tempo, certo?
Com as tabelas corretamente criadas no banco de dados chegou a hora de criarmos a nossa própria migration. É com ela que trabalharemos neste tutorial.
- 5- Criando uma migração
Lembra do artisan? Vamos usá-lo novamente, e não será a última vez! Como eu disse, ele facilita e agiliza muito nossos processos durante o desenvolvimento.
No seu terminal, na pasta raiz do projeto, digite o seguinte comando:
php artisan make:model Produto -m
O que este comando está de fato fazendo? Nós já vimos que para criar uma tabela no banco de dados utilizando o Laravel é necessário criarmos um arquivo de migração, dentro de database/migrations, certo? Pois bem, após a execução deste comando você pode entrar no diretório de migrations e verificar que um terceiro arquivo foi criado.
Agora precisamos dizer para essa nova migração que criamos quais campos queremos na nossa tabela. Como você já deve ter percebido estamos criando uma tabela para armazenar dados sobre um determinado produto, então vamos nos preocupar em guardar o nome, custo, preço e quantidade.
Altere o seu arquivo de migração para que fique igual ao meu:
Com o arquivo de migração devidamente alterado, no seu terminal na pasta raiz do projeto digite novamente:
php artisan migrate
Agora dá para entender mais claramente a utilidade da tabela migrations, certo? O Laravel já detectou que as outras duas migrations (users e failed_jobs) já foram executadas e impediu que elas fossem executadas novamente.
Novamente, vamos checar se a nossa tabela de produtos foi criada corretamente no banco de dados, acesse localhost/phpmyadmin.
Clique em Estrutura para confirmar se os campos estão corretos:
Pronto, nossa tabela de produtos está criada.
Mas espere um momento! Por que o comando que digitamos usou a palavra Produto no singular?
E mais! Por que o comando é make:model e não make:migration???
Acontece que o Laravel facilita a integração entre a tabela e a Model (que nada mais é do que um “representante” de uma tabela existente dentro do framework, com a Model conseguimos Criar, Visualizar, Editar e Deletar com muita facilidade, veremos mais para frente ainda nesse tutorial) criando a model no singular, para representar uma tabela com nome escrito no plural. Por isso nossa tabela se chama produtos e nossa Model se chama Produto, pois dessa forma o Laravel já sabe qual tabela essa Model está representando para nós.
Confuso? Na prática fica muito mais fácil!
- 6 – Configurando a Model
Na raiz do projeto encontre a pasta app, e em seguida o arquivo Produto.php e abra no seu editor de código preferido.
Agora vamos configurar algumas informações necessárias para começarmos a efetivamente desenvolver o tão esperado CRUD.
A princípio precisamos informar a nossa Model, que lembre-se, é um representante da nossa tabela, quais campos podem ser preenchidos/editados por nosso código. Para isso precisamos declarar uma variável protegida nos moldes do Laravel.
A variável fillable literalmente informa a nossa model que esses campos que estão dentro do array serão preenchidos e/ou editados por nosso código em algum momento.
E acredite ou não, por enquanto é só isso que precisamos fazer na model!
- 7 – C de Create (Criação de registro)
Finalmente! Vamos iniciar o nosso CRUD e para a não surpresa de todos, começaremos do começo, ou seja, do C, vamos criar um registro na tabela de produtos.
Vamos começar criando uma página com um formulário simples, como o nosso foco nesse tutorial é o Laravel utilizaremos os recursos mais básicos do html, apenas para conseguirmos preencher e enviar um formulário, ok?
O Laravel por padrão armazena e reconhece seus arquivos de páginas html em resources/views, localize esse diretório e crie uma pasta chamada produtos, em seguida, dentro dessa nova pasta, crie um arquivo chamado create.blade.php.
Edite o seu novo arquivo, create.blade.php, para que fique desta forma:
Que extensão maluca é essa? Blade.php, nunca vi isso! Relaxa, o Blade facilita e muito a administração de html, layouts e redirecionamentos também, como veremos em breve.
Bom, temos o formulário criado, mas como nós podemos acessá-lo?
Vamos aprender um outro comando artisan? Em seu terminal, na pasta raiz do projeto, digite o seguinte comando:
php artisan make:controller ProdutosController
Agora navegue pela pasta raiz do seu projeto e encontro o diretório app\Http\Controllers e em seguida localize o arquivo que acabamos de criar, o ProdutosController.php
Crie uma função chamada create, e nela retorne a função view, essa função do Laravel percorre o diretório resources/views e tenta encontrar a o arquivo que você especificou como parâmetro e o carrega no navegador.
Perceba que eu não usou a barra (/) para dizer que estou em um subdiretório, no lugar dela usamos o ponto. Outro fato que merece atenção é que não precisamos informar a extensão .blade.php pois o Laravel, por padrão, já busca arquivos desse tipo.
Chegou a hora de verificarmos se a nossa função está funcionando corretamente e se a nossa página com o formulário será carregada. Na pasta raiz do seu projeto localize o diretório routes e em seguida o arquivo web.php, e abra no seu editor de código.
Vamos criar uma rota para acessar a nossa página de formulário.
Perceba que eu chamo o método get para informar qual é o verbo HTTP que deve ser usado nessa rota. O primeiro parâmetro é a rota propriamente dita, e isso fica a seu critério, já o segundo é o nome do controller responsável por executar a função que vem logo após o arroba, e no nosso caso acabamos de criar a função create no arquivo ProdutosController.php, certo?
Chegou a hora de testar, vamos ligar o servidor do Laravel e acessar pelo navegador para ver nosso formulário carregando. Para isso vá no seu terminal, na pasta raiz do projeto, e digite o seguinte comando:
php artisan serve
Este comando irá ligar o servidor nativo do Laravel, e a aplicação poderá ser acessada em localhost:8000.
Para acessar a nossa página de formulário acesse localhost:8000/produtos/novo (no meu caso essa é a rota, se você colocou uma outra rota no arquivo web.php, então utilize-a)
Aí está o nosso formulário, carregando corretamente na nossa rota!
Agora chegou a hora de fazermos com que o seu envio crie um novo produto na nossa tabela do banco de dados.
Vamos continuar os nosso trabalhos! No ProdutosController, crie uma função chamada store.
É obrigatório que a função de criação se chame store? Não.
Mas para mantermos as boas práticas, SIM, POR FAVOR.
Perceba que na linha 5 está sendo chamada a classe Request. Essa classe administra e armazena as requisições HTTP básicas, ou seja, todo formulário enviado deve passar por essa classe, a princípio (em um outro artigo nos aprofundaremos mais neste assunto).
Então antes de mais nada temos que configurar a nossa função store para esperar uma requisição HTTP.
Dessa forma conseguiremos obter os dados que estão sendo enviados pelo nosso formulário.
Antes de partir para a inserção efetiva no banco de dados vamos verificar se os dados enviados pelo formulários estão chegando corretamente na nossa função store, para isso utilizaremos a função nativa do Laravel dd(), que é a abreviação de “debug, die”.
Repare que utilizei a instância da classe Request para chamar a função all(), que imprimirá na tela todas as informações que estão chegando. O controller está devidamente configurado para o nosso primeiro teste de envio de formulário, mas para testarmos efetivamente precisamos criar a rota responsável pelo envio, assim como terminar de configurar nosso formulário HTML.
No arquivo de rota web.php cria uma nova rota, dessa vez utilizando o verbo post e a função store do nosso controller!
Perceba que no primeiro argumento eu mantive a mesma string para a rota, e nesse caso não tem problema pois estamos utilizando dois verbos diferentes, o get e o post, então não haverá conflitos.
No nosso formulário HTML devemos adicionar a propriedade method=”post” pois por padrão (não entendo até hoje o porquê) ele vem configurado como get. E além disso precisamos dizer para o formulário para qual rota ele enviará as informações, e para isso precisamos adicionar a propriedade action=”rota”, onde rota é a o caminho que acabamos de criar.
Para facilitar nossa vida e principalmente evitar erros, o Laravel possui uma função que nomeia as rotas e nos permite invocá-las pelo nome e não apenas pelo caminho.
Edite novamente a rota que você acabou de criar, adicionando a função name().
Perceba que eu nomeei a minha rota de envio das informações como “registra_produto” e agora posso chamá-la através da função route(). No seu arquivo blade que contém o formulário, adicione as propriedades de que falamos acima.
Mais uma vantagem em se utilizar a extensão blade.php juntamente com o Laravel é de poder usar funções nativas do framework. Basta utilizarmos os mustaches, que são essas chaves duplas, que o arquivo blade entenderá que se trata de um código PHP. Nesse caso estamos chamando a função route() e dizendo qual é o nome da rota que queremos utilizar.
Mas calma, não saia testando ainda porque vai dar erro! O Laravel além de agilizar nosso desenvolvimento também reforça, e muito, a segurança de nossa aplicação.
Para impedir que sejam enviadas informações de outros lugares que não sejam a nossa aplicação o Laravel, por padrão, verifica se o formulário enviado possui um token único e temporário. Para gerar esse token basta adicionar, entre as tags de formulários, o componente @csrf. Mais uma vez estamos trabalhando com a magia dos arquivos blade, que nos permite invocar componentes e escrever códigos PHP utilizando o @.
Atenção: existe uma grande diferença entre utilizar os mustaches ({{ }}) e o arroba, mas isso veremos em um próximo artigo.
Agora sim, com tudo configurado corretamente basta preencher nosso formulário e enviar clicando no botão Salvar.
Vejam que após clicar em Salvar nossa rota foi chamada e caímos de fato na função store do ProdutosController. Perceba que além das informações de nome, custo, preço e quantidade também temos o token de validação que mencionei acima!
Faça um teste e retire o @csrf do seu formulário e tente enviar para ver o que acontece!
Excelente, temos nossas informações chegando corretamente na nossa função, agora vamos de fato salvar no banco de dados!
Vá na sua função store e deixe ele como a minha:
Não se esqueça de chamar a classe da Model Produto, como eu fiz na linha 6!
Editou o seu Controller e está como o meu? Então volte no seu formulário, preencha novamente e envie.
Vamos verificar lá no banco de dados se o produto foi realmente criado! Acesse localhost/phpmyadmin, entre no banco que você criou e veja e na tabela produtos está presente o registro que acabamos de criar.
Prontinho, está criado o nosso produto! Você não acreditou em mim quando eu disse que a Model facilitava muito a interação com o banco né?
Apenas utilizando a função create da model Produto conseguimos informar quais dados seriam inseridos nos campos determinados e já efetuar a inserção.
Claro que seria necessário uma validação de dados para não deixar que erros ocorressem (como por exemplo um usuário enviar uma palavra no campo de custo fazendo com que o sistema quebrasse) mas isso é assunto para um próximo artigo.
Neste tutorial estamos focando nas funcionalidades de interações com o banco!
A conclusão deste artigo você vê na quarta-feira da semana que vem. Fique ligado.