[WINDOWS] - Preparando-se para o desenvolvimento
Windows downloads - Zip
Extrair o zip em uma pasta e mover para: C:\
php --version
Adicionar o caminho do diretório PHP no path das variáveis de ambiente
php.ini-development renomear para php.ini (Ambiente de Desenvolvimento)
- Download
- Windows Installer
- Composer-Setup.exe
- Windows Installer
composer --version
composer self-update
Configurando a memória limite do PHP
php -r "echo ini_get('memory_limit');"
php --ini
-1 = Ilimitado
memory_limit = -1
Modificando a versão do Composer
composer --version
composer --help
C:\ProgramData\ComposerSetup\bin\
Versão do curso: 1.10.7
Configuração para buscar os pacotes no packagist:
composer config -g repo.packagist composer https://packagist.org
Configuração GitHub:
composer config -g github-protocols https ssh
Forçando a instalação do Laravel 7.0.:
composer create-project --prefer-dist laravel/laravel projeto_laravel_via_composer "7.0"
Localhost:
cd public/
php -S localhost:80
Introdução as Rotas, Controllers e Views
composer create-project --prefer-dist laravel/laravel app_super_gestao "7.0.0"
php artisan list
php artisan -V
php artisan serve
Rotas - Organização das Rotas no Laravel:
- API;
- Channels;
- Console; e
- Web.
php artisan route:list
Controllers
php artisan make:controller PrincipalController
php artisan make:controller TesteController
php artisan make:controller FornecedorController
Extensão: laravel-blade
Limpar as views compiladas do cache
php artisan view:clear
csrf (Garante segurança no envio de dados do form)
- Cross-site request forgery ou falsificação de solitação entre sites.
Model (-m = Migration)
php artisan make:model SiteContato -m
php artisan make:model Fornecedor
Executando as Migrations
- php.ini - Remover o ;
;extension=pdo_sqlite
Listagem das migrates e informa se já foi executada
php artisan migrate:status
Reverte todas as migrações do banco - do mais novo para o antigo - rollback
php artisan migrate:reset
Reverte todas as migrações e na sequência roda o migrate, criando um banco de dados zerado
php artisan migrate:refresh
Faz o drop de todos os objetos do banco de dados + o migrate para recriar os objetos
php artisan migrate:fresh
(UP) Mais antiga para a mais atual
php artisan migrate
(UP) Rodar uma migration com o caminho (--path)
php artisan migrate --path="database/migrations/2022_01_15_205953_create_produtos_table"
(DOWN) Da mais atual para a mais antiga
php artisan migrate:rollback
(DOWN) Passos - batch - step
php artisan migrate:rollback --step=2
php artisan make:migration create_fornecedores_table
php artisan make:migration alter_fornecedores_novas_colunas
php artisan make:migration create_produtos_table
php artisan make:migration create_produto_detalhes_table
php artisan make:migration create_unidades_table
php artisan make:migration ajuste_produtos_filiais
php artisan make:migration alter_fornecedores_nova_coluna_site_com_after
signed - aceita valores negativos
unsigned - não aceita valores negativos
SGBD MySQL
Custom ->
MySQL Servers -> MySQL Server
Applications -> MySQL Workbench
High Availabity -> Standalone MySQL Server / Classic MySQL Replication
Type and Networking -> Config Type: Development Computer (Reserva menos memória)
Authentication Method -> RECOMMENDED
Accounts and Roles -> Definir a senha
Windows Service -> - [x] Start the MySQL Server at System Startup
Serviços do Windows -> MySQL80
Query
cd c:/xampp/mysql/bin
mysql.exe -u root -p
CREATE DATABASE sg;
USE sg;
SELECT * FROM migrations;
DESCRIBE fornecedores;
DESCRIBE site_contatos;
DESCRIBE produtos;
DESCRIBE produto_detalhes;
Testando o PDO
php -r "var_dump(extension_loaded('pdo_mysql'));"
Se retornar false, acessar o php.ini e remover o ; da linha: ;extension=pdo_mysql
Eloquent ORM - Laravel utiliza Active Record
- Dois padrões: Data Mapper e Active Record
Tinker - Console interativo nativo do Laravel
php artisan tinker
$contato = new \App\SiteContato();
$contato->nome = 'Lucas';
$contato->telefone = '(51) 98611-4444';
$contato->email = '[email protected]';
$contato->motivo_contato = 1;
$contato->mensagem = 'Olá! Gostaria de mais detalhes sobre o Super Gestão.';
Método vem da classe Model
print_r($contato->getAttributes());
Método vem da classe Model
$contato->save();
$contato2 = new \App\SiteContato();
$contato2->nome = 'Fulano';
$contato2->telefone = '(51) 98611-0000';
$contato2->email = '[email protected]';
$contato2->motivo_contato = 2;
$contato2->mensagem = 'Estou gostando muito do Super Gestão.';
print_r($contato2->getAttributes());
$contato2->save();
php artisan tinker
$f = new \App\Fornecedor();
$f->nome = 'Fornecedor XYZ';
$f->site = 'fornecedorxyz.com.br';
$f->uf = 'RS';
$f->email = '[email protected]';
print_r($f->getAttributes());
$f->save();
php artisan tinker
\App\Fornecedor::create(['nome' => 'Fornecedor ABC', 'site' => 'fornecedorabc.com.br', 'uf' => 'SP', 'email' => '[email protected]']);
php artisan tinker
// $fornecedores = \App\Fornecedor::all();
use \App\Fornecedor;
$fornecedores = Fornecedor::all();
print_r($fornecedores->toArray());
foreach($fornecedores as $f) { echo $f->nome; echo ' - '; }
php artisan tinker
use \App\Fornecedor;
$fornecedores2 = Fornecedor::find(2);
echo $fornecedores2->nome;
$fornecedores2 = Fornecedor::find([1, 2, 3, 4]);
foreach($fornecedores2 as $f) { echo $f->nome; echo ' - '; }
/**
* where (comparação) operadores lógicos
* >
* >=
* <
* <=
* <>
* ==
* like
*/
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::where('id', '>', 1);
$contatos = SiteContato::where('id', '>', 1)->get();
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::whereIn('motivo_contato', [1, 3])->get();
$contatos = SiteContato::whereNotIn('motivo_contato', [1, 3])->get();
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::whereBetween('id', [3, 6])->get();
$contatos = SiteContato::whereNotBetween('id', [3, 6])->get();
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::where('nome', '<>', 'Fernando')->whereIn('motivo_contato', [1, 2])->whereBetween('created_at', ['2022-01-15 23:27:54', '2022-01-15 23:29:57'])->get();
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::where('nome', '<>', 'Fernando')->orWhereIn('motivo_contato', [1, 2])->orWhereBetween('created_at', ['2022-01-15 23:27:54', '2022-01-15 23:29:57'])->get();
Selecionando registros com whereNull() e whereNotNull()
php artisan tinker
use \App\SiteContato
$contatos = SiteContato::whereNull('updated_at')->get();
$contatos = SiteContato::whereNotNull('updated_at')->get();
$contatos = SiteContato::whereNotNull('updated_at')->orWhereNull('created_at')->get();
Selecionando registros com base em parâmetros do tipo data e hora
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::whereDate('created_at', '2022-01-15')->get();
$contatos = SiteContato::whereDay('created_at', '15')->get();
$contatos = SiteContato::whereMonth('created_at', '01')->get();
$contatos = SiteContato::whereYear('created_at', '2022')->get();
$contatos = SiteContato::whereTime('created_at', '=', '23:27:54')->get();
$contatos = SiteContato::whereTime('created_at', '>', '23:00:00')->get();
Selecionando registros com whereColumn()
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::whereColumn('created_at', 'updated_at')->get(); // Não compara valores nulos
$contatos = SiteContato::whereColumn('created_at', '=', 'updated_at')->get();
$contatos = SiteContato::where('id', '>', 0)->whereColumn('created_at', 'updated_at')->get();
Selecionando registros aplicando precedência em operações lógicas
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::where(
function($query) {
$query->where('nome', 'Lucas')
->orWhere('nome', 'Fulano');
}
)->where(
function($query) {
$query->whereIn('motivo_contato', [1, 2])
->orWhereBetween('id', [4, 6]);
}
)->get();
Ordenando registros
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::all();
$contatos = SiteContato::orderBy('nome', 'asc')->get();
$contatos = SiteContato::orderBy('nome', 'desc')->get();
$contatos = SiteContato::orderBy('motivo_contato')->orderBy('nome', 'desc')->get();
Introdução as Collections
Collection first, last e reverse
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::where('id', '>', 3)->get();
$contatos->first();
$contatos->last();
$contatos->reverse(); // ordem reversa
Collection toArray e toJson
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::all()->toArray();
$contatos = SiteContato::all()->toJson();
Collection pluck
php artisan tinker
use \App\SiteContato;
$contatos = SiteContato::all()->pluck('email');
$contatos = SiteContato::all()->pluck('email', 'nome');
Atualizando registros (save)
php artisan tinker
use \App\Fornecedor;
$fornecedor = Fornecedor::find(1);
$fornecedor->nome = 'Fornecedor 123';
$fornecedor->site = 'fornecedor123.com.br';
$fornecedor->email = '[email protected]';
print_r($fornecedor);
$fornecedor->save();
Atualizando registros (fill e save)
php artisan tinker
use \App\Fornecedor;
$fornecedores2 = Fornecedor::find(2);
$fornecedores2->fill(['nome' => 'Fornecedor 789', 'site' => 'fornecedor789.com.br', 'email' => '[email protected]']);
$fornecedores2->save();
Atualizando registros (where e update)
php artisan tinker
use \App\Fornecedor;
Fornecedor::whereIn('id', [1, 2])->update(['nome' => 'Fornecedor Teste', 'site' => 'teste.com.br']);
Deletando registros (delete e destroy)
php artisan tinker
use \App\SiteContato;
$contato = SiteContato::find(4);
$contato->delete();
SiteContato::where('id', 7)->delete();
SiteContato::destroy(5);
Deletando registros com SoftDelete
php artisan make:migration alter_fornecedores_softdelete
php artisan migrate:status
php artisan migrate
php artisan tinker
use \App\Fornecedor;
$fornecedor = Fornecedor::find(2);
$fornecedor->delete(); // Removido mas segue na tabela
Fornecedor::all();
$fornecedor = Fornecedor::find(1);
$fornecedor->forceDelete(); // Removido da tabela
Selecionando e restaurando registros deletados com SoftDelete
php artisan tinker
use \App\Fornecedor;
Fornecedor::withTrashed()->get();
Fornecedor::create(['nome' => 'Fornecedor 1', 'site' => 'fornecedor1.com.br', 'uf' => 'RS', 'email' => '[email protected]']);
Fornecedor::onlyTrashed()->get();
$fornecedor = Fornecedor::withTrashed()->get();
$fornecedor[0]->restore();
Gravando os dados do formulário no banco de dados
$contato = new SiteContato();
$contato->nome = $request->input('nome');
$contato->telefone = $request->input('telefone');
$contato->email = $request->input('email');
$contato->motivo_contato = $request->input('motivo_contato');
$contato->mensagem = $request->input('mensagem');
print_r($contato->getAttributes());
$contato->save();
Validação de quantidades mínimas e máximas de caracteres (min e max)
Criando o Seeder de Fornecedor
php artisan make:seeder FornecedorSeeder
Execução de Todos os Seeders
php artisan db:seed
Criando o Seeder de SiteContato
php artisan make:seeder SiteContatoSeeder
Execução do Seeder SiteContato
php artisan db:seed --class=SiteContatoSeeder
Criando a Factory SiteContato
php artisan make:factory SiteContatoFactory --model=SiteContato
Criando a Model e Migration de Motivo Contato
php artisan make:model MotivoContato -m
Criando o Seeder de MotivoContato
php artisan make:seeder MotivoContatoSeeder
Verificando o status
php artisan migrate:status
Executando o migrate
php artisan migrate
Execução do Seeder MotivoContato
php artisan db:seed --class=MotivoContatoSeeder
Adicionando a FK motivo_contatos no site_contatos
php artisan make:migration alter_table_site_contatos_add_fk_motivo_contatos
php artisan migrate:status
php artisan migrate
Limpar os registros
TRUNCATE site_contatos;
Criando um middleware
php artisan make:middleware LogAcessoMiddleware
Migration e Model de LogAcesso
php artisan make:model LogAcesso -m
php artisan migrate:status
php artisan migrate
SELECT * FROM log_acessos;
php artisan route:list
Encadeamento de middlewares (criando um middleware de autenticação)
php artisan make:middleware AutenticacaoMiddleware
Implementando o formulário de Login
php artisan make:controller LoginController
Validando a existência do usuário e senha no Banco de Dados
INSERT INTO users(name, email, password) values('Lucas', '[email protected]', '1234');
Implementando o menu de opções da área protegida da aplicação
php artisan make:controller HomeController
php artisan make:controller ClienteController
php artisan make:controller ProdutoController
Implementando o cadastro de fornecedores parte 5 (remoção de registros)
Fornecedor::find($id)->delete();
Fornecedor::find($id)->forceDelete(); // Ignora o soft delete
Controladores com resources
- index() -> Exibir lista de registros
- create() -> Exibir formulário de criação de registro
- store() -> Receber formulário de criação de registro
- show() -> Exibir registro específico
- edit() -> Exibir formulário de edição do registro
- update() -> Receber formulário de edição do registro
- destroy() -> Receber dados para remoção do registro
php artisan make:controller --help
php artisan make:controller --resource ProdutoController --model=Produto
yes
Criando rotas associadas aos resources de um controlador
php artisan route:list
Implementando o cadastro de produtos parte 1 (index)
php artisan make:model Unidade
php artisan tinker
use App\Unidade;
Unidade::create(['unidade' => 'UN', 'descricao' => 'Unidade']);
use App\Produto;
Produto::create(['nome' => 'Geladeira', 'descricao' => 'Geladeira/Refrigerador', 'peso' => 60, 'unidade_id' => 1]);
Produto::create(['nome' => 'TV', 'descricao' => 'Smart TV LED 42', 'peso' => 8, 'unidade_id' => 1]);
Eloquent ORM 1 para 1 - Implementando produto detalhes parte 1
php artisan make:model ProdutoDetalhe
php artisan make:controller --resource ProdutoDetalheController