> LOADING ARTICLE...
17 Dec 2024 Laravel

Como utilizar os Model Observers do Laravel

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 simple...

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 *

> COOKIE_CONSENT_REQUIRED

We use essential cookies for the site to work, and analytics cookies (Google Analytics) to understand how you use it. Analytics cookies are only enabled with your consent. Privacy Policy