- Database seeding
- Endpoints de Users, Products e Auth(login, logout...)
- Tratamento de dados com Resources
- Validação FormRequest,
- Filtragem de Campos(fields) pela URL,
- Autenticação e Autorização JWT (utilizando o pacote tymon/jwt-auth),
Clone o projeto:
git clone «URL DO REPOSITÓRIO»
Uma vez clonado, abra na pasta do projeto:
cd «DIR DO PROJETO»
Dentro da pasta do projeto, crie o arquivo .env e copie o arquivo .env.example para o .env. Agora, modifique o .env inserindo as credenciais do seu banco de dados.
DB_CONNECTION=mysql
DB_HOST=«ENDEREÇO DO SEU BANCO DE DADOS»
DB_PORT=3306
DB_DATABASE=«NOME DO SEU BANCO DE DADOS»
DB_USERNAME=«USUÁRIO DO SEU BANCO DE DADOS»
DB_PASSWORD=«SENHA PARA O USUÁRIO»
Por exemplo:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_crud
DB_USERNAME=root
DB_PASSWORD=
Agora, instale o projeto:
composer install
php artisan key:generate
php artisan jwt:secret
php artisan migrate --seed
php artisan serve
Explicando o Projeto
Vamos definir a URL base http://127.0.0.1:8000 (a porta 8000, ou host 127.0.0.1 podem ser diferentes conforme a configuração do seu ambiente)
Todas as Requisições HTTP que irão interagir com os recursos da API utilizarão a combinação da URL base + Endpoint (Essa combinação se chama URI)
Se combinarmos a URL base http://127.0.0.1:8000 e o endpoint /api/products
formaremos a URI http://127.0.0.1:8000/api/products
Agora que deixei claro que não desconheço os termos técnicos. Para simplificar as explicações, sempre que formos fazer requisições irei mencionar apenas o Endpoint
Então vamos à Prática!
- Abra o Postman e Digite a Base URL,
Base URL = http://127.0.0.1:8000, - Selecione o Verbo/Método(GET,POST,PUT,DELETE),
- Acrescente o Endpoint,
- Clique em Send/Enviar
'REQUISICOES DE PRODUTOS'=> [
['Exibir Todos os Produtos' => ['Verbo: GET', 'Endpoint: /api/products']],
['Criar um Novo Produto' => ['Verbo: POST', 'Endpoint: /api/products']],
['Exibir Apenas um Produto' => ['Verbo: GET', 'Endpoint: /api/products/{product}']],
['Atualizar um Produto' => ['Verbo: PUT', 'Endpoint: /api/products/{product}']],
['Deletar um Produto' => ['Verbo: DELETE', 'Endpoint: /api/products/{product}']]
],
'REQUISICOES DE USUARIOS'=> [
['Exibir Todos os Usuários' => ['Verbo: GET', 'Endpoint: /api/users']],
['Criar um Novo Usuário' => ['Verbo: POST', 'Endpoint: /api/users']],
['Exibir Apenas um Usuário' => ['Verbo: GET', 'Endpoint: /api/users/{user}']],
['Atualizar um Usuário' => ['Verbo: PUT', 'Endpoint: /api/users/{user}']],
['Deletar um Usuário' => ['Verbo: DELETE', 'Endpoint: /api/users/{user}']]
],
'REQUISICOES DE AUTENTICACAO'=> [
['Entrar na conta do Usuário' => ['Verbo: POST', 'Endpoint: /api/auth/login']],
['Sair da Conta do Usuário' => ['Verbo: POST', 'Endpoint: /api/auth/logout']],
['Atualizar o Token de Acesso do Usuário' => ['Verbo: POST', 'Endpoint: /api/auth/refresh']],
['Mostrar Dados do Usuário' => ['Verbo: POST', 'Endpoint: /api/auth/me']]
],
Endpoints de Users, Products e Auth(login, logout...)
No Postman:
Para Exibir Todos os Produtos:
- Faça uma Requisição com o verbo GET e Endpoint /api/products
- 'id'
- 'title'
- 'url'
- 'price'
- 'description'
- 'created_at'
- 'updated_at'
Para Criar um Novo Produto:
- Abra uma nova aba HTTP(‘File’, depois ‘New…’ e depois ‘HTTP’)
- Clique em ‘Body’ e em seguida ‘x-www-form-urlencoded’
- Preencha as Keys(chaves) (‘title’,’url’,’price’,’description’) e os Values(valores) que você deseja Criar
- title: Teste
- url: www.teste.com
- price: 100.00 (Para fração use '.' e não ',')
- description: Meu primeiro teste
Para Exibir Apenas um Produto:
- Substitua {product}, no final do Endpoint, pelo Número do ID do Produto que você deseja Exibir
- Faça uma Requisição com o verbo GET e Endpoint /api/products/{product}
- GET e Endpoint /api/products/8 irá Exibir o Produto que tem o ID 8
Para Atualizar um Produto:
- Abra uma nova aba HTTP(‘File’, depois ‘New…’ e depois ‘HTTP’)
- Clique em ‘Body’ e em seguida ‘x-www-form-urlencoded’
- Preencha as Keys(chaves) (‘title’,’url’,’price’,’description’) e os Values(valores) que você deseja Atualizar
- title: Teste ALTERADO
- url: www.testealterado.com
- price: 900.00 (Para fração não usa ',', usa '.')
- description: Meu primeiro teste ALTERADO
- Substitua {product}, no final do Endpoint, pelo Número do ID do Produto que você deseja Atualizar
- Faça uma Requisição com o verbo PUT e Endpoint /api/products/{product}
Para Deletar um Produto:
- Substitua {product}, no final do Endpoint, pelo Número do ID do Produto que você deseja Deletar
- Faça uma Requisição com o verbo DELETE e Endpoint /api/products/{product}
- DELETE e Endpoint /api/products/8 irá Deletar o Produto que tem o ID 8
Para Testar USUÁRIOS:
- No Endpoint troque 'products' por 'users'
- Use o MESMO PROCEDIMENTO que usou em PRODUTOS, porém as Chaves serão:
- name
- password
Autenticação e Autorização JWT (utilizando o pacote tymon/jwt-auth)
Para Fazer LOGIN e LOGOUT:
- Crie um Usuário(password precisa ter no mínimo 8 dígitos)
- Envie seu novo usuário via Verbo POST para o Endpoint api/auth/login
- Copie o Token gerado em access_token sem "aspas"
- Clique em Headers
- Crie a key Authorization
- Digite bearer no Value de Authorization
- Cole o Token logo após bearer
- Key: Authorization
- Value:bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vMTI3LjAuMC4xOjgwMDAvYXBpL2F1dGgvbG9naW4iLCJpYXQiOjE3MDA3NDY3NDIsImV4cCI6MTcwMDc1MDM0MiwibmJmIjoxNzAwNzQ2NzQyLCJqdGkiOiJWZ1JPZ2JqTjA2eHpxSDNYIiwic3ViIjoiMTciLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.8UgJ-hZzinLgv_NYmHpoMvkkhR0FKl8zCCcsghT96fk
Rotas Protegidas:
Route::resource('/users', UserController::class);
Route::resource('/products', ProductController::class)->except(['show']);
Rotas Não Protegidas:
Route::post('/users', [UserController::class, 'store']);
Route::get('/products', [ProductController::class, 'index']);
Route::post('/products', [ProductController::class, 'store']);
Route::get('/products/{id}', [ProductController::class, 'show']);
Filtragem de Campos(fields) pela URL:
- Acrescente ?fields=title,url,price,description no final do Endpoint /api/products
- Faça uma Requisição com o verbo GET e o Endpoint formado(api/products?fields=title...)
- Retire o atributo que você não deseja exibir. Só serão exibidos os listados em fields
Database Seeding
Estes Produtos foram Populados em Massa através da:
- Criação da Factory ProductFactory
- Criaçao do Seeder ProductsTableSeeder
- Execução do DatabaseSeeder
Como isso Funciona?
Simples! Como o próprio nome diz:
Factory = Fábrica
Seeder = Semeador
Factories:
Na Factory relacionamos cada chave do Produto com um faker(). Esse faker() é usado para criar valores fictícios. Podemos escolher vários formatos de faker() disponíveis na Biblioteca PHP Faker do GitHub https://github.com/fzaninotto/Faker
Exemplo: ‘url’ => fake()→url()
A Factory faz apenas isso. Só define o Formato que será construído. Tecnicamente, ela define como criar Instâncias da Classe Products
Seeders:
No Seeder nós semeamos/populamos o Banco de Dados com dados fictícios definidos na Factory
Nesse Projeto eu decidi popular 15 Instâncias/registros conforme o trecho de código abaixo:
Product::factory(15)→create();
Database Seeder:
O DatabaseSeeder é responsável por reunir todos os Seeders do Projeto e executá-los em sequência na ordem de cima para baixo. Se um Seeder depende de outro ele deve estar abaixo do que ele depende para ser executado depois.
Isso significa que quando o DatabaseSeeder for executado teremos vários Produtos Fictícios que serão fundamentais para testarmos o Projeto