Tópicos
IDE Helper
Para melhorar a inteligência de código (auto complete) instale o pacote “Laravel IDE Helper”, para isso execute o comando abaixo:
composer require --dev barryvdh/laravel-ide-helper
Uma vez instalado basta executar os comandos no artisan para configurar a instalação:
php artisan ide-helper:generate
php artisan ide-helper:models
Os comandos acima irão gerar dois arquivos na raíz do projeto Laravel, _ide_helper.php e _idehelpermodels.php. Estes arquivos são chamados de “stubs”, e possuem códigos que vão auxiliar a inteligência de código do seu editor/IDE.
Agora quando usar um Model, além de todos os métodos do Eloquent você também deverá ser capaz de localizar os atributos do seu Model na lista de auto complete.
Resource controllers
Ao invés de declarar cinco rotas (ou mais) no arquivo api.php/web.php para as operações de C.R.U.D. de sua aplicação, é possível declarar apenas uma rota que representa todas essas operações padrões com Resource Controllers. Para isso basta executa o comando do artisan abaixo ao criar seu Controller:
php artisan make:controller ProductController -r
Esse comando irá gerar o controller com métodos padrões que poderão ser encontrados pela declaração de rota abaixo:
// Laravel <= 7
Route::resource('products', 'ProductController');
// Laravel >= 8
Route::resource('products', [ProductController::class]);
Caso esteja criando rotas para um API, basta executar o mesmo comando, porém ao invés de usar o parâmetro -r
, utilize --api
. Isso irá criar o controller com alguns métodos a menos que são específicos para SSR. A declaração da rota também muda, ficando assim:
// Laravel <= 7
Route::apiResource('products', 'ProductController');
// Laravel >= 8
Route::resource('products', [ProductController::class]);
Model binding
Quando criamos uma rotina para exibir dados de um determinado recurso de nossa aplicação, normalmente seguimos o seguinte fluxo:
Declaração da rota
// ...
Route::get('products/{id}', [ProductController::class, 'show']);
Declaração da rotina
// ...
public function show(int $id)
{
$product = Product::find($id);
return view('products', compact('product'));
// ...
}
Porém, com Model binding é possível obter o recurso diretamente pelo ID passado na rota em conjunto com o Providor do Model, desta forma:
Declaração da rota
// ...
Route::get('products/{product}', [ProductController::class, 'show']);
Declaração da rotina
// ...
public function show(Product $product)
{
return view('products', compact('product'));
}
OBS: O nome do parâmetro na rota precisa ser exatamente o nome do Model e da variável usada no método do controller.
Soft delete
Por último, quando trata-se de registros no banco de dados, sabemos o valor que a informação tem, e portanto, não queremos realmente deletar o registro ao invocar a funcionalidade de remoção. Sendo assim, optamos por trocar alguma “flag” ou algo parecido para determinar que o registro “deletado” não de ve ser exibido, preservando o registro em si.
Para realizar o procedimento de “soft delete” podemos tanto criar uma flag para isso no banco de dados e controlar isso manualmente, ou então usar um recurso do próprio framework, que seria:
- Adicionar a Trait no Model
// ...
use Illuminate\Database\Eloquent\SoftDeletes;
// ...
class User extends Model
{
// ...
use SoftDeletes;
// ...
- Adicionar o campo de “soft delete” na relação desejada
// ...
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->softDeletes();
// ...
});
}
// ...
- Remoção para “lixeira”
O softDeletes adicionado na migration irá criar uma coluna chamada “deleted_at” do tipo “timestamp” (ou similar que represente uma data), uma vez que algum registro tiver essa coluna preenchida com valor, o framework tratará o registro como “deletado”, ou seja, na lixeira.
Para colocar um registro na lixeira, basta usar o método delete()
, exemplo:
// ...
User::find($id)->delete();
// ...
- Obtendo registros “deletados”
Os métodos de obter e listar não trarão registros na lixeira, exceto se for explicitado no query build com o método withTrashed()
, exemplo:
// ...
User::withTrashed()->all();
// ...
- Excluido permanentemente
Agora, caso precise remover o registro do banco de dados, basta usar o método forceDelete()
, exemplo:
// ...
User::withTrashed()->find($id)->forceDelete();
// ...
OBS: Não se esqueça de usar withTrashed()
, caso contrário o registro não será encontrado por estar na lixeira.