Erişimciler Nasıl Çalışır ve Neden Harika?

Erişimcilerin nasıl çalıştığını hatırlayalım. İçinde düşünün kullanıcılar DB tablosundaki sütunları var adı ve soyadı olarak - ancak, tablodaki biri olarak bunları görüntülemek istediğiniz tam adı . Ancak her seferinde bu dizi birleştirme işlemini yapmak istemezsiniz, bu nedenle erişimciler harika bir çözümdür!

Bunu sadece app / User.php'de tanımlarsınız :

public function getFullNameAttribute()
{
    return $this->name . ' ' . $this->surname;
}

Ve sonra, ne zaman $ user nesnesine sahip olsanız , bunu örneğin Blade'e yazabilirsiniz:

{{ $user->full_name }}

Eloquent , bu yöntemi çağırmakla ve ayrıca full_name snake durumunu getFullNameAttribute deve durumuna dönüştürerek ilgilenecektir.

 

Problem 1: Bu Alan Nedir?

Sorunlar genellikle daha büyük projelerde ve daha büyük ekiplerde, kod başkası tarafından devralındığında başlar.

Örneğin, tabloda veya başka bir yerde listelenen çok sayıda alanınız olduğunda ve belirli alanın bir erişimci olduğunu açıkça görmediğinizde. Örneğin, yakınlarda user-> full_name ve user-> home_address görürseniz , birisi muhtemelen her ikisinin de DB sütunları olmasını bekler, değil mi?

Bu nedenle, erişimciler kodun okunabilirliğine zarar verir. Küçük bir geliştirici (veya Laravel'e daha az aşina olan biri) kodun bu bölümünde çalışırsa daha da kötüleşir - bu alanın neden veritabanında bulunmadığını anlamaları çok zaman alabilir ve full_name sütununu arayarak geçmiş taşıma işlemlerinde dakikalar / saatler harcayın .

Ayrıca, bu alanlar IDE'nizde "tıklanabilir" değilse, bu nedenle bu yöntemin içinde gerçekten ne sakladığını bulmak kolay değildir. PhpStorm gibi IDE'nizde "getFullName" için tüm projeyi (veya model dosyasını) aramanız gerekir.

 

Çözüm olarak: Yalnızca "Getter" Yöntemlerini Kullanın

Basit - hiçbir şeye dönüştürme yapmadan yöntemleri yöntem olarak kullanın.

Öyleyse, Blade'de {{$ user-> full_name}} yerine, buna sahip olmak daha okunaklı olmaz mıydı? {{$ user-> getFullName ()}} .

İlk olarak, bunun bir DB sütunu olmadığı hemen anlaşıldı - sonunda () ile, bunun bir yöntem olduğu açıktır . Ayrıca, IDE'niz üzerine tıklamanıza ve Modelinizde bu yöntemin içine girmenize izin verecektir. Daha kolay gezinme, ha?

Modelde, sadece yeniden adlandırmak getFullNameAttribute () için getFullName () :

public function getFullName()
{
    return $this->name . ' ' . $this->surname;
}

Katılıyor musun?