Laravel Model Observers(LifeCycle)

Yasin DALKILIÇ
3 min readMar 22, 2021

--

Laravel Model Observers

Herkese merhabalar bu yazımızda sizlerle beraber Laravel’de model observerlarına ve lifecyclarına bakmaya çalışıyor olacağız. Öncelikle nedir bu lifecycle’lar ne yapabiliriz diyecek olursak, örneğin model üzerinden bir kayıt oluştururken, yada oluşturulurken veya silinirken veya silmeye zorlanırken veya güncellenmeden önce gibi durumları ele alıp müdahale etmek isteyebiliriz. Örneğin bir kayıt oluşturulurken ben mail atmak için kuyruğa yazabilirim , log tutabilirim , model silindikten sonra diğer tablolarla ilişkisini kopartabilirim, model güncellenirken bir başka tabloya başka bir veri yazabilirim gibi bir çok senaryo kurabiliriz. Şimdi de bir örnek yapalım.

Proje Oluşturma

composer create-project laravel/laravel example-app
cd example-app
php artisan serve

Model & Migration Oluşturma

php artisan make:model Test
php artisan make:migration create_test_table

Migration Çalıştırma

php artisan migrate

Yapılandırma

Projemiz içerisinde app/Models/Test.php geliyoruz ve aşağıdaki gibi kodluyoruz

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Log;
class Test extends Model
{
use HasFactory;
protected $table='test';
protected $fillable=['ad','soyad'];

public static function boot()
{
parent::boot();
static::creating(function(Test $test){
Log::info('Test Modeli Oluşturuluyor Yeni Bir Kayıt',[$test]);
});

static::created(function (Test $test){
Log::info('Test Modeli Oluşturulduı Yeni Bir Kayıt',[$test]);

});
static::deleting(function(Test $test){
Log::info('Kayıt Siliniyor',[$test->id]);
Test::create(['ad'=>'mahmut','soyad'=>'Koc']);
});
static::deleted(function(Test $test){
Log::info('Kayıt Silindi',[$test->id]);
});
}
}

yukarıdaki örnekte model oluşturulurken log tutuyoruz, daha sonra oluşturulduktan sonra oluşturulduğuna dair yeni bir log tutuyoruz, model üzerinden veri silinirken log tutup örneğin yine aynı model’e bir kayıt ekliyoruz, silindikten sonra tekrar bir log tutuyoruz buradaki isteklerimiz tamamen bizim ihtiyaçlarımızla alakalı. Peki biz yalnızca created,creating,deleting,deleted gibi işlemlerde mi müdahale edebiliyoruz tabiki hayır listesi tam olarak şurada.

İyi güzel hoş biz bu işlemleri model üzerinde mi yazacağız bir süre sonra burası şişecek bir çok iş devreye girecek olabilir işte bunun için sırasıyla ;

Observer Oluşturma

php artisan make:observer TestObserver --model=Test

diyorum ki sen bir observer oluştur daha sonra bu test modelini kullanacak haberin olsun. :)

İlgili observer’a app/Observers/TestObservers.php altında ulaşabiliriz.

Observer’a dönüp baktığımız zaman bizim için hazır aşağıdaki gibi methdolar yazılmış.

<?php

namespace App\Observers;

use App\Models\Test;
use Illuminate\Support\Facades\Log;

class TestObserver
{
/**
* Handle the Test "created" event.
*
*
@param \App\Models\Test $test
*
@return void
*/
public function created(Test $test)
{
//
}

/**
* Handle the Test "updated" event.
*
*
@param \App\Models\Test $test
*
@return void
*/
public function updated(Test $test)
{
//
}

/**
* Handle the Test "deleted" event.
*
*
@param \App\Models\Test $test
*
@return void
*/
public function deleted(Test $test)
{
//
}

/**
* Handle the Test "restored" event.
*
*
@param \App\Models\Test $test
*
@return void
*/
public function restored(Test $test)
{
//
}

/**
* Handle the Test "force deleted" event.
*
*
@param \App\Models\Test $test
*
@return void
*/
public function forceDeleted(Test $test)
{
//
}
}

bizde gelip buraya model üzerinde yaptığımız methodları ekleyelim

<?php

namespace App\Observers;

use App\Models\Test;
use Illuminate\Support\Facades\Log;

class TestObserver
{
/**
* Handle the Test "created" event.
*
*
@param \App\Models\Test $test
*
@return void
*/
public function created(Test $test)
{
//email atılacak
//git bunu kuyruga yaz

Log::info('Test Modeli Oluşturulduı Yeni Bir Kayıt',[$test]);

//
}

public function creating(Test $test)
{
Log::info('Test Modeli Oluşturuluyor Yeni Bir Kayıt',[$test]);

//
}

/**
* Handle the Test "updated" event.
*
*
@param \App\Models\Test $test
*
@return void
*/
public function updated(Test $test)
{
//
}

/**
* Handle the Test "deleted" event.
*
*
@param \App\Models\Test $test
*
@return void
*/
public function deleted(Test $test)
{
Log::info('Kayıt Silindi',[$test->id]);
//
}

public function deleting(Test $test){
Log::info('Kayıt Siliniyor',[$test->id]);
}

/**
* Handle the Test "restored" event.
*
*
@param \App\Models\Test $test
*
@return void
*/
public function restored(Test $test)
{
//
}

/**
* Handle the Test "force deleted" event.
*
*
@param \App\Models\Test $test
*
@return void
*/
public function forceDeleted(Test $test)
{
//
}
}

artık model üzerinden ilgili boot fonksiyonunu silebiliriz. Ve son olarak biz observer’a oluşturduk ama laravel’e de bunu kullan senin bundan haberin olsun diyebilmek için app/Providers/EventServiceProvider.php içersine aşağıdaki gibi register etmemiz gerekiyor ;

<?php

namespace App\Providers;

use App\Models\Test;
use App\Observers\TestObserver;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
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()
{
Test::observe(TestObserver::class);
//
}
}

daha sonra ilgili model üzerinden bir kayıt oluşturma,silme işlemi yaptıgımızda ilgili iş kodlarımızın çalıştığını göreceksiniz.

Daha fazlası için ;

Laravel Resmi Dökümanına Bir Göz Atabilirsiniz.

Yada Kanalımdaki Videoya Bakabilirsiniz.

Kaynak Kodunu Burada Bulabilirsiniz.

Herkese İyi Çalışmalar Dilerim.

--

--

Yasin DALKILIÇ
Yasin DALKILIÇ

Written by Yasin DALKILIÇ

Hi, My name is Yasin I am a Software Developer, I love so much researching and development 😊 Here is my youtube channel @webciyasin

No responses yet