Como utilizar os Model Observers do Laravel

Olá devs.
Hoje a pedido de um amigo das minhas redes sociais, vou explicar como usar os Model Observers do Laravel. Este é um exemplo simples que tem como unico objectivo que entendas de forma basica e simplificada como usar os model observers.
Vou dar-te uma pequena definição e usar os model observers para gerar uma slug, gerar um id unico ou qualquer coisa que necessite lógica antes e depois de criar um registo. Os model observers vao sem duvida facilitar a tua vida e tornar o teu código mais profissional e limpo.
Primeiramente vou descrever de forma bem simples cada um dos Hooks disponibilizados num Model Observer e quando o código nele constante será executado:
->Retrieved: depois de retornar o registo
->Creating: antes de criar o registo
->Created: depois de criar o registo
->Updating: antes de alterar o registo
->Updated: depois de alterar o registo
->Saving: antes de um registo ser salvo (criado ou alterado)
->Saved: depois de um registo ser salvo (criado ou alterado)
->Deleting: antes de o registo ser apagado ou soft-deleted
->Deleted: depois de um registo ser apagado ou soft-deleted
->Restoring: antes de um registo soft-deleted ser restaurado
->Restored: depois de um registo soft-deleted ser restaurado
Segue então o exemplo:
O exemplo conta então num model Food que tem as colunas name, slug, price e unique_id. Preciso então criar um registo unicamente com name e price, mas quando ele for criado preciso gerar a slug e o unique_id.
app/Models/Food.php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Food extends Model
{
use HasFactory;
protected $fillable = [
'name', 'price', 'slug', 'unique_id'
];
}
Para criares o Observer para a class Food executa o seguinte comando:
php artisan make:observer FoodObserver --model=Food
Será criada então a seguinte class:
app/Observers/FoodObserver.php
namespace App\Observers;
use App\Models\Food;
class FoodObserver
{
/**
* Handle the Food "created" event.
*
* @param \App\Models\Food $food
* @return void
*/
public function creating(Food $food)
{
$food->slug = \Str::slug($food->name);
}
/**
* Handle the Food "created" event.
*
* @param \App\Models\Food $food
* @return void
*/
public function created(Food $food)
{
$food->unique_id = 'PR-'.$food->id;
$food->save();
}
/**
* Handle the Food "updated" event.
*
* @param \App\Models\Food $food
* @return void
*/
public function updated(Food $food)
{
}
/**
* Handle the Food "deleted" event.
*
* @param \App\Models\Food $food
* @return void
*/
public function deleted(Food $food)
{
}
/**
* Handle the Food "restored" event.
*
* @param \App\Models\Food $food
* @return void
*/
public function restored(Food $food)
{
}
/**
* Handle the Food "force deleted" event.
*
* @param \App\Models\Food $food
* @return void
*/
public function forceDeleted(Food $food)
{
}
}
Agora é necessário registar os Model Observers no provider. Na class app/Providers/EventServiceProvider.php digita o seguinte código:
namespace App\Providers;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;
use App\Observers\FoodObserver;
use App\Models\Food;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
Food::observe(FoodObserver::class);
}
}
Vamos agora criar a Route.
routes/web.php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\FoodController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('food', [FoodController::class, 'index']);
O controller será o seguinte:
app/Http/Controllers/FoodController.php
namespace App\Http\Controllers;
use App\Models\Food;
use Illuminate\Http\Request;
class FoodController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$food = Food::create([
'name' => 'WaterMelon',
'price' => 10
]);
dd($food);
}
}
Agora é só executares a tua app et voila…
Espero que isto te ajude… Ajusta ao teu código e estará a bombar…
Antes de saires deste artigo deixa-me apresentar-te a empresa onde eu alojo as minhas aplicações. A WebHS tem sido uma parceira excelente para os meus projectos. Tenho projectos em alojamentos partilhados e tenho servidores dedicados também. Têm um suporte 20 estrelas (não estou a exagerar) extremamente rápido a resolver problemas e sempre dispostos a ajudar. Recomendo muito.
Para saberes mais clica na imagem seguinte.

One Response
Perfeito.
Simples, claro e objetivo.
Parabéns!!!