Mutator mı dedin? Evet adı biraz alengirli. Ne yapıyor bu mutator? İşleri derli toplu halde yapabilmenizi sağlıyor. Diyelim ki bir kullanıcı tablonuz var ve bu tabloyla ilişkili modelinizin adı da User. Tablonuzda kullanıcının şifresini saklıyorsunuz. Fakat kullanıcı şifresini belirlediğinde veritabanına kaydetmeden önce şifreyi şifrelemeniz gerekiyor (password hashing). Kullanıcının şifresini kaydederken basitçe $user->password = "şifre";
diyebilecekken neden $user->password = Hash::make("şifre");
diyelim ki değil mi? Mesela hash fonksiyonunda bir değişiklik yapmak istesek, kullanıcının şifresini kaydettiğimiz her dosyaya girip tek tek hash fonksiyonu mu değiştireceğiz? Tabi ki hayır. İşte mutator bunu yapıyor.
Mutatorları kullanarak modelinizin değişkenlerine yeni değerler atarken bu değerleri modifiye ederek kaydedebilirsiniz. Mesela yukarıdaki örnekteki gibi bir mutator belirleyelim. Eğer mutator belirleyeceğimiz alan password ise, mutator metodumuzun adı setPasswordAttribute olmak zorunda. Diyelim ki belirleyeceğimiz alanın adı is_writer olsun. Bu durumda mutator metodumuzun adı setIsWriterAttribute oluyor. Kullanıcının şifresini $user->password = “şifre”; diyerek belirlemek istiyorsanız modelimize eklememiz gereken mutator:
public function setPasswordAttribute($value) {
$this->attributes['password'] = Hash::make($value);
}
Dikkat ettiyseniz şifre alanını $this->attributes dizisindeki passworde atadık. Eğer $this->password = Hash::make($value); şeklinde belirleseydik, belirlediğimiz mutatorı çağırmış olacaktık (stack overflow 🙂 ). Dolayısıyla doğrudan diziyi kullanarak değişkenimizi belirledik. Yukarıdaki mutatorı yazdıktan sonra kullanıcının şifresini belirlemek istediğinizde artık tek yapmanız gereken $user->password = “Yeni şifre”; demek. Sonrasında modelin save() metodunu çağırmayı unutmayın.
Mutatorların get metodları da mevcut. Yine yukarıdaki gibi belirleyebilirsiniz bu mutatorları. Diyelim ki görsel tablonuzdaki bir görselin yolunu path kolonunda tutuyorsunuz. Bu görsel tablosunu da Image modeli ile ilişkilendirdiniz. Modelden path değişkenini istediğinizde direkt görselin URL adresini alabilirsiniz.
public function getPathAttribute($value) {
return Utils::imageUrl($value);
}
Böylece $image->path değişkenini istediğinizde artık görselin URL adresini alabilirsiniz. Mutatorları ve yaratıcılığınızı kullanarak birçok işi çok kolay bir şekilde yapabilirsiniz. Örneğin modelin oluşturulduğu tarihi format edilmiş şekilde almak istiyorsanız, getCreatedAtAttribute mutatorı kullanabilirsiniz. Mutatorları kullanmaya özen gösterirseniz uygulamanızın temellerini de sağlamlaştırmış olursunuz.