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
Veja que no método up estamos criando os campos que vamos utilizar em nossa tabela.
Inserir no método down:
O arquivo da Migration ficou assim:
Vamos agora executar o comando php artisan migrate para criar a tabela no banco:
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:
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:
Para:
Meu arquivo Request ficou assim:
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:
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:
Inserir também no arquivo app.php do diretório \config o seguinte trecho dentro do bloco 'providers' => [ ... ]:
Inserir nesse mesmo arquivo, dentro do bloco códigos 'aliases' => [ ... ], o seguinte código:
Na linha de comando, execute agora o comando composer update para instalar o pacote:
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:
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:
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=
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
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).
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:
Assinar:
Postar comentários
(Atom)
Destaques:
- Sublime - Como Programar Atalho Para Identar O Código
- Instalar o WSL2 e Configurar o Docker no Windows
- Como Traduzir O Visual Studio 2012 Para Português
- Sublime - Atalhos Para Comentar O Código
- Como retirar a sessão Attribution do Blog
- #5 - Instanciando e Utilizando o PhpUnit
- Mural de recados no seu blog
- Quer adicionar jogos ao seu blog?
- #2 - Testes Unitários X Testes De Integração X Testes De Sistema
- Retire a Navbar do blog
Comentários
Perfil
Formada em Sistemas de Informação e pós-graduada em Engenharia de Software.
Parabéns, bem explicado.. vou tentar fazer e ver se da certo.
ResponderExcluir