🚧 Projeto em construção 🚧
Projeto desenvolvido durante o curso de Laravel da Alura para controle de séries com as seguintes funções:
- CRUD de séries
- PHP 7.3
- Laravel 8.75
- MySql
1 - Instalando dependências de back-end
composer install
2 - Instalando dependências de front-end
npm install
2 - Configurando banco Criar arquivo .env copiando as configurações do arquivo .env.example
3 - Rodar migrations
php artisan migrate
4 - Gerar chave de aplicação
php artisan key:generate
5 - Subir servidor
php artisan serve
composer create-project laravel/laravel:^8.0 nome-do-projeto
php artisan
php artisan serve
Route::verboHTTP('rota', [nome da classe, metodo]);
Route::get('/series', [SeriesController::class, 'listarSeries']);
Route::controller(SeriesController::class)->group(function () {
Route::get('/series', 'index')->name('series.index');
Route::get('/series/create', 'create')->name('series.create');
Route::post('/series/salvar', 'store')->name('series.store');
});
Route::resource('/series', SeriesController::class)
->only(['show']);
Route::resource('/series', SeriesController::class)
->except(['show']);
Route::delete('/series/destroy/{serie}', [SeriesController::class, 'destroy'])
->name('series.destroy');
Para criar um controler é preciso acessar a pasta App/Http/Controllers
Verb | URI | Action | Route Name |
---|---|---|---|
GET | /photos | index | photos.index |
GET | /photos/create | create | photos.create |
POST | /photos | store | photos.store |
GET | /photos/{photo} | show | photos.show |
GET | /photos/{photo}/edit | edit | photos.edit |
PUT/PATCH | /photos/{photo} | update | photos.update |
DELETE | /photos/{photo} | destroy | photos.destroy |
php artisan make:controller SeriesController
php artisan make:controller PhotoController --resource
Boas práticas: Não dar o echo direto de um controler
O segundo parametro corresponde ao HTTP status code e o 3 os cabeçalhos
return response($resposta, '201', []);
Por padrão já é retornado o codigo 200
return $resposta
Se retornar um objeto, array, ele vai automaticamente retornar um JSON
public function index(Request $request)
{
//pega o id da url
$request->get('id');
$request->url();
$request->method();
$request->input();
$request->all();
$request->only(['nome', 'descricao']);
$request->except(['_token']);
return redirect("google.com.br");
1 - arquivo 2 - dados (variaveis a serem passadas pra view - array)
return view('listar-series', [
'series' => $series
]);
É o mesmo que
return view('listar-series', compact('series'));
Que também é o mesmo que
return view('listar-series')->with('series', $series);
{{$serie}} = echo $serie
@foreach($series as $serie)
<li>{{$serie}}</li>
@endforeach
É o mesmo que
<?php foreach ($series as $serie) {?>
<li><?=$serie?></li>
<?php } ?>
Por padrão se cria uma pasta dento de resources>view>pasta>index.blade.php e no controller se chama series.index. O ponto indica a separação de diretório. Ex: create.blade.php
criar uma pasta components em resources>views
<html>
<title>Series</title>
<body>
<h1>{{$title}}</h1>
{{$slot}}
</body>
</html>
Title é um atributo que pode ser passado e slot o corpo sendo x-nome-do-component que é o nome do arquivo criado
<x-layout title="Séries">
<ul>
@foreach($series as $serie)
<li>{{$serie}}</li>
@endforeach
</ul>
</x-layout>
php artisan make:component Alerta
Isso também cria uma classe em App>View>Component
O Blade não irá parsear e enviará nome
@{{nome}}
<script>
const series = {{Js::from($series)}}
<script>
@isset($mensagemSucesso)
...
@endisset
- Laravel Mix - pacote javascript
Para baixar o pacote laravel mix:
npm install
É preciso ter instalado o node /npm - NPM é um gerenciador de dependencia
npm install bootstrap
incluir a linha @import "~bootstrap/scss/bootstrap"; em resources>css>scss
Rodar
npm run dev
php artisan make:migration create_series_table
php artisan migrate
php artisan migrate:rollback
php artisan make:model Serie
Ao utilizar comando acima, o laravel mapeia a model Serie para a tabela series. Também posso definir a tabela caso não siga o padrão:
protected $table = 'seriados';
@csrf - evita ataque Cross-site request Forgery
dd - dump and die
$series = DB::select('SELECT nome FROM series;');
$series = Serie::all();
Serie::query()->orderBy('nome')->get();
$request->session()->put('mensagem.sucesso', 'Série removida com sucesso.');
ou
session(['mensagem.sucesso' => 'Série removida com sucesso.']);
$request->session()->has('mensagem.sucesso');
$request->session()->get('mensagem.sucesso');
ou
session('mensagem.sucesso');
$request->session()->forget('mensagem.sucesso');
$request->session()->flash('mensagem.sucesso', 'Série removida com sucesso');
composer require barryvdh/laravel-debugbar --dev
php artisan make:mail SeriesCreated
https://mailtrap.io/
Mail::to($user)->queue($email);
no arquivo .env:
QUEUE_CONNECTION=database
php artisan queue:table
php artisan tinker
Utilizar em produção:
php artisan queue:work
Utilizar em tempo de desenvolvimento:
php artisan queue:listen
Colocar na fila para tentar reprocessar de novo
php artisan queue:retry "all"
php artisan queue:failed
Tentar 2 vezes em caso de falha com delay de 10 segundos entre uma tentativa e outra
php artisan serve queue:work --tries=2 --delay=10
Não é o ideal geralmente.
Limpar a fila
php artisan queue:clear
php artisan make:listener EmailUsersAboutSeriesCreated
Criar listener informando qual evento ele vai escutar
php artisan make:listener LogSeriesCreated -e SeriesCreated
php artisan make:event SeriesCreated
É necessário configurar em EventServiceProvider para que o evento seja executado
SeriesCreated::class => [
EmailUsersAboutSeriesCreated::class,
],
Log::info("Série criada com sucesso");
$request->file('cover')->store('series_cover');
Salvar arquivo definindo um nome
$serie = $this->repository->add($request);
Escolher onde salvar o arquivo (public)
$request->file('cover')->store('series_cover', 'public');
Criar um link simbólico para deixar arquivo acessível
php artisan storage:link
php artisan test
php artisan make:test SeriesRepositoryTest