> LOADING ARTICLE...
17 Dec 2024 Desenvolvimento

Como utilizar os Model Observers do Laravel

Como utilizar os Model Observers do Laravel

modelobservers

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.

webhs
Alojamento recomendado pela DigitalDev

Marketing Digital para Clínicas: O Guia Completo para Conquistar 1000 Pacientes

O Que é Marketing Digital para Clínicas?Principais Ferramentas do Marketing Digital para ClínicasSEO (Otimização para Motores de Busca)Redes SociaisGoogle AdsMarketing…

Read More..

Uso Eficiente de Relações no Laravel – Otimização de Consultas e Melhores Práticas e correção de problema N+1

Indexação de Base de Dados: 5 Dicas que Deve Seguir no Seu Projeto Laravel

Como Funciona a Paginação no Laravel: Técnicas e Boas Práticas

Query Scopes no laravel – Os 2 tipos que existem

About Post Author

One Response

  1. Râmerson Rodrigues diz:

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

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *