Haydar ŞAHİN

Laravel Eloquent Event Kullanımı

Laravel veya herhangi bir framework kullanırken mutlaka event (olay) ve listener (dinleyici) mantığına ihtiyaç duyuyoruz. Eğer Laravel kullanıyorsanız işinizi kolaylaştıracak bir tüyo vermek istiyorum. Bu yazının devamında kullanacağımız kısımlar için Laravel’in event/listener yapısını biliyor olmanızı öneririm. Eğer bilmiyorsanız buradan resmi belgelendirmeden yararlanabilirsiniz.


Öncelikle çağıracağımız event ve listenerları oluşturalım. Belgelendirmeden de okuyabileceğiniz gibi bunu yapmanın birden fazla yolu var ama ben bana en kolay gelen yolu yani event ve listenerları birlikte oluşturmayı göstereceğim. Ne de olsa event oluşturuyorsak, mutlaka listener da oluşturacağız demektir. Ben örnek olarak işinize yarayacağını düşündüğüm, yeni bir kullanıcı kaydı yapıldığında tetiklenen bir olayı ele alacağım. Şimdi App\Providers\EventServiceProvider.php dosyamızı açalım ve $listen dizisini şu şekilde değiştirilelim;

protected $listen = [
        'App\Events\YeniKayit' => [
            'App\Listeners\Yapilacakİslemler',
        ],
    ];

Burada YeniKayit adlı bir event ve Yapilacakİslemler adlı bir listenerımız var. Bu arada söylemem gerek var mı bilmiyorum ama yazılım standartlara göre bu kodlarında İngilizce olması gerekiyor ama ben daha iyi anlamanız için Türkçe yaptım. Daha sonra consolumuzda şu kodu çalıştırıyoruz.

php artisan event:generate

Bunu yaptıktan sonra App\Events\YeniKayit.php ve App\Listeners\Yapilacakİslemler.php adından iki dosyamızın oluştuğunu göreceksiniz. Şimdi bu dosyalarımıza kısa bir ara verirken App\User.php dosyamızı açalım. Burada bilmemiz gereken şey ise crud işlemlerimizi sağladığımız eluquent paketinin aynı zamanda istenildiğinde bazı eventleri tetikleyebildiğidir. Bu eventler şu şekildedir, retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored. Bunların hangi durumlarda tetiklendiğini ve geriye ne döndürdüğü ile ilgili ayrıntılar için buradan belgelendirmedeki açıklamaya bakabilirsiniz. Bu örnek için created durumunda kayıt edilen modelin verisini yani user verisini döndürecek. Bunu ilgili modelimizde aşağıdaki gibi $dispatchesEvents dizisinin yapısıyla sağlayabiliriz. Mesela bu örnekte biz bir kayıt olduğunda YeniKayit adlı eventimizin tetiklenmesini istiyorsak dispatchesEvents dizisine aşağıdaki gibi created elemanı ekliyoruz. Eğer güncelendiğinde tetiklenmesini isteseydik updated elemanı ekleyecektik. İstersek başka durumlar için birden başka elemanda ekleyebiliriz tabi…

 protected $dispatchesEvents= [
        'created'=>Events\YeniKayit::class,
    ];

Eloquent Events özelliği Laravel 5.4’de geldi ancak o sürümde bu özelliği kullanmak için gerek dizinin adı $dispatchesEvents değil sadece $event idi. Laravel 5.6 ile bu dizinin adı dispatchesEvents olarak değiştirildi. Bu yüzden farkı kaynaklardan farklı kaynaklarda $dispatchesEvents yerine $events görürseniz şaşırmayın.

Şimdi tekrar App\Events\YeniKayit.php dosyasını açalım. Eloquent bize created durumda user verilerini yollayacağı için öncelike user classının yerini use ‘App\User;’ koduyla işaretlememiz gerekiyor. Daha sonra __construct metodu yani kurucu metodumuzda User bilgilerini istememiz gerekiyor. Gerekli kod aşağıdaki gibidir.

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

use App\User;

class YeniKayit
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $user;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user=$user;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

Bu YeniKayit event user verilerini aldığında EventServiceProvider.php’de belirlediğimiz gibi Yapilacakİslemler Listenerını tetikleyecek ve user verilerini ona teslim edecek.

<?php

namespace App\Listeners;

use App\Events\YeniKayit;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;


class SendVerificitionMail
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     *
     * @param  NewUser  $event
     * @return void
     */
    public function handle(YeniKayit $event)
    {
        //Çalışmasını istediğiniz kod. 
    }
}

Çalışmasını istediğiniz kodu handle metodunun arasına yazarsanız User modeline yeni  kayıt geldiğinde yazdığınız kodu tetikleyecektir.

Exit mobile version