Bu yazıda Laravel ile proge egliştirirken benim sıkça kullandığım güzel 2 özellikten bahsedeceğim.
Accessors
Model ile veritabanından bir veriye ulaştıktan sonra o veriyi göstermeden önce ona müdahale etmenize imkan sağlıyor. Diyelim ki şehir adı sakladığınız bir tabloda verileriniz hep küçük harfle yazılmış durumda. Siz bu şehirleri gösterirken baş harfi büyük olacak şekilde imla kurallarına uygun bir halde göstermek istiyorsunuz. Bu durumda muhtemelen veriyi yazdırdığınız yerde ucfirst($text)
fonksiyonunu kullanıyorsunuz. Bu şekilde kullandığınız zaman şehir adını yazdırmanız gereken her yerde aynı kod kalıbını kullanmanız gerekiyor. Oysa veriyi yazdırmadan önce şehir isimleri bir kontrolden geçerek baş harfi büyütülmüş şekilde gelseydi o kod kalıbını her yere taşımak zorunda kalmazdınız. Bir noktada iş halledilir ve size sadece yazdırmak kalırdı. İşte bu durumu çözebilmek için Accessors özelliğini kullanıyoruz. Veriler veritabanından çekildikten hemen sonra biz daha yazdırmadan accessor fonksiyon tarafından işlenebiliyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class City extends Model { protected $fillable = [ 'name', 'code' ]; public function getNameAttribute($value) { return ucfirst($value); } } |
Bu örnekte City
modeline getNameAttribute
adında bir fonksiyon yazdık. Bu fonksiyonun diğerlerinden farkı başında get
sonunda ise Attribute
yazıyor olması. Ortada geçen isim ise tablodaki sütunun adıdır. camelCase olarak fonksiyon adını yazdıktan sonra bir daha bizim bir kontrol yapmamıza gerek kalmıyor. Artık aşağıdaki gibi doğrudan veriye ulaşıp üzerinde bir işlem yapmadan yazdırabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\City; class HomeController extends Controller { public function index() { $city = City::first(); echo $city->name; } } |
1 |
Adana |
Accessors ile çalışmak sadece projenin içinde değil dışında da bize kolaylıklar sağlıyor. Eğer projenin ihtiyaçları gereği API yazdıysanız onu kullanacak olan kişiler de kontrol yapmaya gerek kalmadan veriyi biçimlendirmiş şekilde görebilir. Tabi API isteklerini model ile cevaplandırdığınızı varsayıyorum 🙂
Mutators
Mutator ise veriyi okurken değil yazarken kullanılır. Örneğin projenizin herhangi bir amaca hizmet eden veri giriş formu var. Bu formdan ad, soyad, doğum tarihi, e-posta vb. bilgiler giriliyor. Bu girilen bilgilerin kayıt aşamasında imla hatalarının ve format hatalarının çözülmesi gerekiyor. Bu durumda formun kayıt edildiği kısımda çeşitli kontroller yapmanız gerekiyor. Kullanıcı giriş yaparken isminin tamamını küçük harfle girmiş olabilir, doğum tarihini çizgi kullanarak girmiş olabilir -oysa siz nokta ile girmesini istiyorsunuzdur-, e-posta adresini tamamen büyük harflerle girmiştir veya boy girerken araya virgül koymuştur. Mutator bunlar gibi giriş sırasındaki sorunları tek merkezden çözmemize olanak sağlıyor. Aynı model ile birden fazla noktada veri girişi yaptırıyorsanız veya projenin dışında içine veri alan bir API yazdıysanız tüm noktalarda tek tek kontrol yapıp kaydetmek yerine model içine mutator yazmanız en kolay ve güzel çözüm olacaktır.
Accessor isimlendirme standardı gibi bunda da fonksiyonun isminin sonunda Attribute
eklenir. Fonksiyonun başına ise get
yerine set
eklenerek camelCase şeklinde yazılır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { protected $fillable = [ 'first_name', 'last_name', 'birth_date', 'email' ]; public function setFirstNameAttribute($value) { return ucfirst($value); } public function setLastNameAttribute($value) { return ucfirst($value); } public function setBirthDateAttribute($value) { return date('d.m.Y', strtotime($value)); } public function setEmailAttribute($value) { return strtolower($value); } } |
Modele gerekli kodları yazdıktan sonra artık kontrol yapmaya gerek kalmadan doğrudan gelen veriyi kaydedebiliriz. Model kayır sırasında gerekli düzenlemeyi yapıp veritabanına istediğiniz şekilde kaydedecektir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\User; class HomeController extends Controller { public function store() { $user = new User(); $user->first_name = request('first_name'); $user->last_name = request('last_name'); $user->birth_date = request('birth_date'); $user->email = request('email'); $user->save(); } } |
Date Mutators
Son olarak date mutators konusuna değinelim.
1 2 |
protected $dates = ['created_at', 'updated_at', 'deleted_at']; protected $dateFormat = 'd.m.Y'; |
Model içinde $dates
değişkenine yazdığınız alanlar otomatik olarak $dateFormat değişkenine yazdığınız şekilde biçimlendirilir. Yukarıda anlattığım konudan hiçbir farkı yoktur. Sadece tarihler için ek bir mutator yazmanıza gerek kalmadan hepsini bir arada biçimlendirmeniz için tek noktada toplanmıştır.
Son olarak;
Accessor ve mutator kullanarak projeye ileriki bir zamanda müdahale etmeniz gerektiğinde tüm kodları tek tek okuyup düzeltmek yerine sadece model dosyalarında değişiklik yaparak kolayca iş yükünden kurtulmuş olursunuz.
Teşekkürler çok güzel bir paylaşım olmuş.