15 de julho de 2019
Oi, pessoas! Nesse post vamos aprender a criar um CRUD no Laravel.

Vou iniciar a criação de um sistema de vendas com o cadastro dos produtos. Criaremos os seguintes métodos:

Inserir produtos - Create
Pesquisar produtos - Read
Atualizar as informações de um produto - Update
Deletar um produto - Delete

Resumindo, o nosso CRUD básico de cada dia.

Supondo que você já leu o post Resumo Sobre a Instalação e Criação De Um Projeto ou já sabe instalar tudo o que é necessário e já possui o ambiente pronto, vamos iniciar um novo projeto.

Criando O Projeto

O nome do nosso novo projeto será sistema_vendas:



Vamos criar também o banco de dados do nosso projeto com o nome bd_sistema_vendas. Caso ainda não saiba criar um banco de dados, verifique esse post.

No arquivo .env do seu projeto, insira as informações de conexão:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=bd_sistema_vendas
DB_USERNAME=root
DB_PASSWORD=



Criando A Migration 

Vamos agora criar a Migration para a criação da tabela produto no nosso BD. Utilize o seguinte comando para criar a migration:

php artisan make:migration create_produto --create=produto



O arquivo foi criado na pasta: \database\migrations

Abrir o arquivo criado e inserir no método up da Migration:

 1     public function up()
 2     {
 3         Schema::create('produto', function (Blueprint $table) {
 4             $table->bigIncrements('id')->unique();
 5             $table->string('nome');
 6             $table->string('descricao');
 7             $table->decimal('preco', 10, 2);
 8             $table->string('status');
 9             $table->timestamps();
10         });
11     }

Veja que no método up estamos criando os campos que vamos utilizar em nossa tabela.

Inserir no método down:

1     public function down()
2     {
3         Schema::dropIfExists('produto');
4     }

O arquivo da Migration ficou assim:

 1 <?php
 2 
 3 use Illuminate\Support\Facades\Schema;
 4 use Illuminate\Database\Schema\Blueprint;
 5 use Illuminate\Database\Migrations\Migration;
 6 
 7 class CreateProduto extends Migration
 8 {
 9     /**
10      * Run the migrations.
11      *
12      * @return void
13      */
14     public function up()
15     {
16         Schema::create('produto', function (Blueprint $table) {
17             $table->bigIncrements('id')->unique();
18             $table->string('nome');
19             $table->string('descricao');
20             $table->decimal('preco', 10, 2);
21             $table->string('status');
22             $table->timestamps();
23         });
24     }
25 
26     /**
27      * Reverse the migrations.
28      *
29      * @return void
30      */
31     public function down()
32     {
33         Schema::dropIfExists('produto');
34     }
35 }

Vamos agora executar o comando php artisan migrate para criar a tabela no banco:


Observe que foi criada a tabela produto e também as tabelas migration (responsável pela administração das migrations - controle de versão do nosso banco), users e password_resets (tabelas responsáveis pela administração dos usuários do sistema).



Criando A Model

Vamos criar a Model para a administração dos dados da tabela produto. Utilize o seguinte comando para criar a model:

php artisan make:model Produto

O arquivo foi criado no diretório \app

Com a inserção dos campos, o arquivo vai ficar assim:


 1 <?php
 2 
 3 namespace App;
 4 
 5 use Illuminate\Database\Eloquent\Model;
 6 
 7 class Produto extends Model
 8 {
 9     //
10 
11     protected $table = 'produto'; // Setando a tabela criada no Banco de dados
12  protected $primarykey = 'id'; // setando a primary key da tabela produto
13 
14  public $timestamps = true; // Registra data e hora da criação e atualização dos registros da tabela produto
15  
16  //carrega os campos da tabela produto
17  protected $fillable = [
18 
19   'nome',
20   'descricao',
21   'preco',
22   'status'
23 
24 
25  ]; 
26 }

Criando O Controller 

Vamos criar o Controller para inserir as operações que vão executar o CRUD em nosso sitema. Utilize o seguinte comando para criar o Controller:

php artisan make:controller ProdutoController --resource
Utilizando, no comando acima, a flag --resource, estamos informando ao Laravel que estamos criando um Controller como recurso, ou seja, um Controller para realizar operações no nosso BD. Automaticamente, ele já insere os métodos que iremos utilizar para realizar o CRUD:

//Método responsável pela exibição da View que exibe os dados no navegador
public function index(){}

//Método responsável pela exibição da View na qual vamos criar os dados
public function create(){}

//Método responsável por receber e processar a requisição de criação dos dados.
public function store(Request $request){}

//Método responsável por exibir um item de acordo com o seu id
public function show($id){}

//Método responsável pela edição dos dados
public function edit($id){}

//Método responsável por atualizar um dado de acordo com o seu id
public function update(Request $request, $id){}

//Método responsável pela deleção dos dados.
public function destroy($id){}

O nosso Controller vai ficar assim:


  1 <?php
  2 
  3 namespace App\Http\Controllers;
  4 
  5 use Illuminate\Http\Request;
  6 use App\Produto; //Inserção da Model Produto
  7 use Illuminate\Support\Facades\Redirect; // Para que sejam aceitos os redirecionamentos dentro das rotas
  8 use Illuminate\Support\Facades\Input;
  9 use App\Http\Requests\ProdutoFormRequest; //Uso do request criado
 10 use DB; //Uso do banco de dados
 11 
 12 class ProdutoController extends Controller
 13 { 
 14  //Método padrão da classe. Todas as vezes que a classe é chamada, esse método é executado.
 15     public function __construct(){
 16 
 17     }
 18 
 19     //Visualização dos dados
 20     public function index(Request $request){
 21 
 22      //Se request é igual a true
 23      if($request){
 24       $query=trim($request->get('searchText'));//Vai capturar uma busca. O trim desconsidera os espaços digitados
 25       $produtos=DB::table('produto')
 26       ->where('nome', 'LIKE', '%'.$query.'%') //Buscando qualquer correspondência entre o texto digitado.
 27       ->where('status', '=', 'ativo') //Vão ser exibidas nessa página somente os produtos ativos.
 28       ->orderBy('id','desc') //A busca sera ordenada pelo campo id. Vamos visualizar do maior para o menor.
 29       ->paginate(7); //Exibir 7 itens por página
 30       //Retorno da view index que estará dentro da pasta \resources\views\produto
 31       return view('produto.index', [
 32        //Variável criada acima
 33        "produtos"=>$produtos, "searchText"=>$query
 34       ]);
 35 
 36      }
 37 
 38     }
 39 
 40     //Criar um produto
 41     public function create(){
 42 
 43         $categorias=DB::table('produto')
 44         ->where('status', '=', 'ativo')
 45         ->get();
 46         return view("produto.create");
 47      
 48     }
 49 
 50     //Salvar os dados
 51     public function store(ProdutoFormRequest $request){
 52 
 53      $produto = new Produto;
 54      $produto->nome=$request->get('nome');
 55      $produto->descricao=$request->get('descricao');
 56      $produto->preco=$request->get('preco');
 57      $produto->status='ativo';
 58      $produto->save();
 59      return Redirect::to('/produto');//Assim que o produto for salvo, redirecionar para o index.
 60      
 61     }
 62 
 63     //Visualização dos produtos
 64     public function show($id){
 65 
 66      return view("produto.show",[
 67 
 68       //Mostrar o campo baseado no id do produto
 69       "produto"=>Produto::findOrFail($id)]);
 70      
 71     }
 72 
 73     //Editar um produto
 74     public function edit($id){
 75 
 76      return view("produto.edit",[
 77 
 78       //Mostrar o campo baseado no id do produto
 79       "produto"=>Produto::findOrFail($id)]);
 80      
 81     }
 82 
 83     //Atualizar um produto
 84     public function update(ProdutoFormRequest $request, $id){
 85 
 86      $produto=Produto::findOrFail($id);
 87      $produto->nome=$request->get('nome');
 88      $produto->descricao=$request->get('descricao');
 89      $produto->preco=$request->get('preco');
 90      $produto->update();
 91      //Após a atualização, redirecionar para:
 92      return Redirect::to('/produto');
 93      
 94     }
 95 
 96     //Deletar um produto
 97     public function destroy($id){
 98 
 99      $produto=Produto::findOrFail($id);
100      $produto->status='inativo';
101      $produto->update();
102      //Após a atualização, redirecionar para:
103      return Redirect::to('/produto');
104      
105     }
106 }

Criando O Request

Vamos criar o Request para a validação dos dados enviados pelo usuário antes de realizarmos create ou update em nosso banco. Utilize o seguinte comando para criar o Request:


php artisan make:request ProdutoFormRequest

No arquivo criado, autorize o processamento das requisições alterando a seguinte função:


1     public function authorize()
2     {
3         return false;
4     }

Para:

1     public function authorize()
2     {
3         return true;
4     }

Meu arquivo Request ficou assim:


 1 <?php
 2 
 3 namespace App\Http\Requests;
 4 
 5 use Illuminate\Foundation\Http\FormRequest;
 6 
 7 class ProdutoFormRequest extends FormRequest
 8 {
 9     /**
10      * Determine if the user is authorized to make this request.
11      *
12      * @return bool
13      */
14     public function authorize()
15     {
16         return true;
17     }
18 
19     /**
20      * Get the validation rules that apply to the request.
21      *
22      * @return array
23      */
24     public function rules()
25     {
26         return [
27             //
28             'nome'=>'required|max:191',
29             'descricao'=>'required|max:191',
30             'preco'=>'required|between:0,99999.99|regex:/^\d+(\.\d{1,2})?$/',
31         ];
32     }
33 
34     public function messages()
35     {
36         return[
37             'preco.regex' => 'Inserir . (ponto) em vez de , (vírgula) no preço.'
38         ];
39     }
40 }

Criando A Rota 

Vamos criar a rota para que o nosso Controller possa ser acessado pelo navegador. Para criar, abra o arquivo web.php do diretório \routes e insira o seguinte código ao final do arquivo:


//A rota é do tipo resource quando for necessário utilizar comunicação com o banco de dados
Route::resource('/produto','ProdutoController');

Instalando o Laravel Collective

Vamos instalar um pacote para trabalhar mais facilmente com formulários Html chamado Laravel Collective. Para instalar, insira no arquivo composer.json a linha:

"laravelcollective/html":"^5.3.0"

Essa nova linha vai ficar nesse trecho:

1     "license": "MIT",
2     "require": {
3         "php": "^7.1.3",
4         "fideloper/proxy": "^4.0",
5         "laravel/framework": "5.8.*",
6         "laravel/tinker": "^1.0",
7         "laravelcollective/html":"^5.8.0"
8     },

Inserir também no arquivo app.php do diretório \config o seguinte trecho dentro do bloco 'providers' => [ ... ]:

Collective\Html\HtmlServiceProvider::class

Inserir nesse mesmo arquivo, dentro do bloco códigos 'aliases' => [ ... ], o seguinte código:

 'Form' => Collective\Html\FormFacade::class,
 'Html' => Collective\Html\HtmlFacade::class,

Na linha de comando, execute agora o comando composer update para instalar o pacote:


Criando as Views

Vamos criar as views para a visualização dos dados e chamada das ações que criamos no nosso Controller para a realização do CRUD.

Crie a pasta produto dentro do diretório \resources\views

Dentro do diretório criado(\resources\views\produto) vamos criar os arquivos:

index.blade.php // View para listar os produtos existentes no banco

create.blade.php // View que vai exibir um formulário para criar um produto

edit.blade.php // View que vai exibir um formulário para editar um produto

modal.blade.php // Modal que vai confirmar a exclusão de um produto

search.blade.php // Pesquisa de produtos

O conteúdo de todos esses arquivos poderá ser visualizado no link que do projeto no GitHub (disponível no final do post).

Inserindo um layout personalizado 

Vamos utilizar em nossa aplicação um layout gratuito que baixei do site Creative Tim. Veja no fim do post um link específico para baixar os arquivos do layout no Github (pra quem quiser realizar o passo a passo separadamente). Para aplicar o novo layout, copie na pasta do layout, a pasta assets para o diretório /public do nosso projeto e crie a pasta layouts dentro de \resources\views.

Salve o template como layout.blade.php dentro do diretório que você criou (\resources\views\layouts)

Altere a chamada do css para a chamada padrão do laravel dentro do arquivo layout.blade.php:

<link href="{{asset('assets/css/material-dashboard.css?v=2.1.1')}}" rel="stylesheet" />

Insira a chamada de conteúdo na área do conteúdo:

@yield('conteudo')

Nos arquivos que criamos no diretório \resources\views\produto, insira a extensão do layout e a declaração de que se tratam de áreas de conteúdo:

@extends('layouts.layout');

@section('conteudo')

Link do projeto no GitHub:

Link do layout utilizado:

Um comentário:

Comentários

Perfil

Kênia Ferreira
Formada em Sistemas de Informação e pós-graduada em Engenharia de Software.

Tópicos