Merhaba,


Bu yazıda Laravel'de Observer kullanımından bahsedeceğim. Observer adı üstünde gözlemleme işlemi yapmaktadır. Yani mesela bir veri kaydedilirken/kaydedildiğinde, silinirken/silindiğinde bu durumu gözleyip o esnada başka bir işlem daha yaptırmak istediğimiz zaman Observer kullanabiliriz. Şimdi daha iyi anlaşılması adına bir örnek üzerinden gidelim;


Veritabanında posts adında bir tablomuz olsun. Bu tabloyu oluşturmak adına bir migration tanımlaması yapalım:

php artisan make:migration create_posts_table

Migration içeriği:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');
            $table->string('slug');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('posts');
    }
}


Post adında bir model dosyası oluşturalım:

php artisan make:model Post

Model içeriği:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $table = 'posts';

    protected $fillable = ['title', 'slug'];
}


Şimdi de observer tanımlaması yapalım:

php artisan make:observer PostObserver --model=Post

Observer içeriği:

<?php

namespace App\Observers;

use App\Post;
use Illuminate\Support\Str;

class PostObserver
{
    public function saving(Post $post)
    {
        $post->slug = Str::slug($post->title);
    }
}

Burada saving fonksiyonu ile Post verisi kaydedilirken (kayıt işlemi öncesinde) slug değerinin ne olacağını belirttik.


Observer tanımlamamızın çalışması için AppServiceProvider dosyasında çağırmamız gerekiyor.

app/Providers/AppServiceProvider.php:

<?php

namespace App\Providers;

use App\Observers\PostObserver;
use App\Post;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        //
    }

    public function boot()
    {
        Schema::defaultStringLength(191);
        Post::observe(PostObserver::class);
    }
}


Artık observer hazır. İşlemi test edebiliriz.


Veritabanında tablomuzun oluşması için komutumuzu yazıyoruz:

php artisan migrate


routes/api.php dosyasını açarak bir route tanımlaması yapıyoruz:

Route::post('post', 'PostController@store');


Controller dosyasını oluşturuyoruz:

php artisan make:controller PostController

PostController içeriği:

<?php

namespace App\Http\Controllers;

use App\Post;

class PostController extends Controller
{
    public function store()
    {
        Post::create(request()->all());
        return response()->json(['message' => 'Veri kaydedildi.'], 200);
    }
}


Postman üzerinden testimizi gerçekleştiriyoruz:

Ve sonuç:


Umarım yararlı olmuştur.


İyi çalışmalar.