Laravel’de Model Eventleri


Laravel’de modellerinizi daha sağlam hale getirip her seferinde aynı işleri yapmaktan kurtulmak istiyorsanız bu eventleri kesinlikle kullanmalısınız.

Ne işe yarar bu eventler? Mesela veritabanındaki görsel tablonuz için bir modeliniz var diyelim, adı da Image olsun. Image modelimizde de görselin yolunu/adını “path” kolonunda tutuyoruz diyelim. Son olarak da her görsel kaydedildiğinde thumbnaillarını kaydetmek istediğimizi düşünelim. Bunu mutatorları kullanarak yapabiliriz. Modelimizde setPathAttribute() metodu oluşturup bu metodun içerisinde thumbnailları oluşturabiliriz. Buraya kadar her şey çok güzel. Peki veritabanından bir görsel sildiğimizde thumbnaillara ne olacak? Ek olarak, görselleri sadece izin verdiğimiz kullanıcıların silmesini istiyorsak her seferinde kullanıcının yetkisi olup olmadığını mı kontrol edeceğiz? İşte bu eventler ile bu anlatılanları model dosyamızın içinden sadece bir kereye mahsus olmak üzere yapabilir ve thumbnailları silmeyi unuttum mu veya yetkileri kontrol ettim mi gibi endişelerinizden kurtulabilirsiniz.

Nasıl kullanılır bu eventlerEventleri modelinizin içerisinden static boot() metodunda kaydetmeniz gerekiyor. boot() metodunu override edeceğimiz için ilk olarak modelin boot() metodunu çağırıyoruz (parent::boot()). Şu an şu durumdayız:

public static function boot() {
    parent::boot();
}

Artık eventleri eklemeye başlayabiliriz. Ekleyebileceğiniz eventler şunlar: creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored. Mesela creating metodunu kullanarak model oluşturulurken (henüz kaydedilmemişken) bir fonksiyon çalıştırabiliriz. Eğer model kaydedildiğinde bir fonksiyon çalıştırmak istiyorsak created metodunu kullanabiliriz. Mesela yeni bir Image instanceı oluşturuyoruz diyelim. Model oluşturulurken otomatik olarak görselin genişlik, yükseklik ve boyutunu kaydedebiliriz. Örneğin:

public static function boot() {
    parent::boot();

    // Görsel oluşturulurken görselin detaylarını da girin
    Image::creating(function(Image $image) {
        // Görselin boyutlarını alın. Index 0 genişlik, index 1 ise yükseklik
        if(!$image->width || !$image->height)
            $dimensions = getimagesize($image->getFullPath());

        // Eğer daha önceden kaydedilmemişse detayları kaydedin
        if(!$image->width) $image->width = $dimensions[0];
        if(!$image->height) $image->height = $dimensions[1];
        if(!$image->size) $image->size = filesize($image->getFullPath());
    });
}

Aynı şekilde görsel oluşturulduktan sonra thumbnailları kaydedebilir, görsel silindikten sonra da thumbnailları silebiliriz:

// Görsel oluşturulduktan sonra thumbnailları oluştur
Image::created(function(Image $image) {
    Image::saveThumbnails($image->getFileName());
});

// Görsel silindikten sonra thumbnailları da sil
Image::deleted(function(Image $image) {
    $image->deleteImageFiles();
});

Artık yeni bir görsel oluşturmak istediğinizde sadece path değişkenini belirleyip modelin save() metodunu çalıştırmanız yeterli. Görseli silmek istediğinizde de modelin delete() metodunu çalıştırarak geride hiç iz bırakmayacak şekilde görselden kurtulabilirsiniz.


Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir