Laravel Observers Nedir ve Nasıl Kullanılır?

225

Bir web uygulamasında bir modeli izlemeniz gereken bir senaryo düşünün. Bu tabloya eklenecek yeni satırlar, güncellemeler, silmeler vs. gibi işlemler için bir bir mail bildirimi ya da bir veritabanı kaydı almanız gerekiyor olsun. Normalde böyle işlemi direkt o işlemi yaptığınız Controller metodu ile yapabilirsiniz. Ama nispeten karmaşık mantıksal işlemlerle, koşullarla bezeli bir metodunuz varsa, o kodun altına üstüne bir şeyler eklemek, kodun güncellenebilirliğini ya da okunabilirliğini kötü etkileyebilir. İşte bu tür uygulamalardan kaçınmak için Laravel içinde default olarak sunulan bir Eloquent özelliği olan Observers'tan bahsetmek istiyorum.

Demin sözünü ettiğim durumlar için kullanılmak üzere her modeliniz için bir make:observer Artisan komutuyla observer sınıfınızı oluşturabilirsiniz. Bir User modelimizin olduğu varsayımıyla, bu kullanıcılar için yapılacak işlemlerde (create, update, delete vb.)kullanılmak üzere bir observer, aşağıdaki kod ile oluşturulabilir.

php artisan make:observer UserObserver --model=User

Bu komut yeni gözlemciyi App/Observers dizininizde oluşturacaktır. İlk defa Observer kullanacaksanız bu dizin projenizde yoktur ama Artisan, siz, yukarıdaki kodu çalıştırdıktan sonra klasörü de oluşturacaktır. Yeni gözlemciniz aşağıdaki gibi görünecek:

<?php
 
namespace App\Observers;
 
use App\Models\User;
 
class UserObserver
{
    /**
     * Handle the User "created" event.
     */
    public function created(User $user): void
    {
        // ...
    }
 
    /**
     * Handle the User "updated" event.
     */
    public function updated(User $user): void
    {
        // ...
    }
 
    /**
     * Handle the User "deleted" event.
     */
    public function deleted(User $user): void
    {
        // ...
    }
 
    /**
     * Handle the User "restored" event.
     */
    public function restored(User $user): void
    {
        // ...
    }
 
    /**
     * Handle the User "forceDeleted" event.
     */
    public function forceDeleted(User $user): void
    {
        // ...
    }
}

Örneğin update() metodu için raw bir mail gönderilebilir:

public function updated(User $user)
    {
       Mail::raw('Kullanıcı bilgileri güncellendi!', function ($message) {
           $message->to(..)
           ->subject(..);
        });
    }

Aynı şekilde bu tür bilgilerin tamamının tarihçesinin saklandığı yeni bir tablo bile birçok proje için kaçınılmaz ihtiyaçlardan birisi olabilir.

Projenin tamamında observer'ları kullandığınız halde bazı durumlarda yapılacak değişikliği sessiz sedasız, observer'dan kaçarak yapmak da mümkün. Bunun için Laravel'de kullanılan -öğrneğin- save() metodunu kullanacaksanız, bu metod observer işlemlerini tetikleyecektir. Ama saveQuietly() ile kayıt işlemini yaparsanız, observer'ı by-pass etmiş olursunuz.

/**
     * Handle the User "updated" event.
     */
    public function updated(User $user): void
    {
        $user = User::findOrFail(1);
 
        $user->name = 'Victoria Faith';
 
        $user->saveQuietly();
    }