2016-04-13 17 views
1

Bir varlığım olduğunda ve kaydetmek, onaylamak veya silmek istiyorum. Tablo yöntemini neden aramak zorundayım? Örneğin:Cakephp 3: Varlık gelen Tablo fonksiyonları Çağrı kötü ya da iyi bir fikir mi?

$articlesTable = TableRegistry::get('Articles'); 
$article = $articlesTable->get(12); 

$article->title = 'CakePHP is THE best PHP framework!'; 
$articlesTable->save($article); 

Neden böyle bir sorunu yok:

$article->save(); 

veya $article->delete();

O uygulamak çok basit:

benim Madde Varlık ben bunu gibi işlemler yapabilir:

namespace App\Model\Entity; 
use Cake\ORM\Entity; 

class Article extends Entity 
{ 

    public function save() 
    { 
     $table = TableRegistry::get($this->source()); 
     $table->save($this); 
    } 

} 

Çalışıyor, ancak kötü bir uygulama veya iyi bir fikir olup olmadığını bilmek istiyorum. peşin :)

cevap

4

TL yılında

teşekkürler; DR: Teknik olarak (kötü uygulama olarak kabul edilir) sıkı bağlantısının yüksek fiyata bunu yapabilir.

Açıklama: Bu en iyi uygulamayı dikkate almayacağım çünkü varlık, bir aptal veri nesnesi olması gerekiyordu. Herhangi bir iş mantığı içermemelidir. Ayrıca genellikle yalnızca basit bir kaydetme çağrısı değildir, ancak uygulamak için bazı takip mantığı vardır: Kaydetmenin başarısını ve başarısızlığını ele alın ve kullanıcı arayüzünü güncelleyerek veya bir yanıt göndererek buna göre hareket edin. Ayrıca, varlığı belirli bir tabloyla etkin bir şekilde birleştirirsiniz. Aptal bir veri nesnesini iş mantığını uygulayan bir nesneye dönüştürüyorsunuz.

Teknik olarak bunu böylelikle yapabilirsiniz ve bence bu şekilde yapan çerçeveler ya da ORM'ler var ama ben bir şeyleri birleştirme hayranı değilim. Kodu olabildiğince bağlı olarak yazmayı tercih ederim. See also SoC.

Ayrıca, herhangi bir kod satırını yaklaşımınızla kaydedeceğinizi düşünmüyorum, sadece farklı bir yere taşıyorsunuz. Varlığı iş mantığına bağlamanın getirilmesini haklı çıkaracak herhangi bir fayda göremiyorum.

Yolunuza giderseniz, bu yöntemi bir özellik olarak uygularım veya kodu tekrarlamaktan kaçınmak için miras almak üzere bir temel varlık sınıfı kullanırdım.

+0

Bu yaklaşım hakkında daha fazla bilgi edinmek istiyorum. Bunu CakePHP'deki Table vs. Entity sınıfları için daha önce düşünmemiştim ve bu niyetini resmi belgelerden almadım. Okumak için tavsiye edeceğiniz bu konu hakkında daha derin bir tartışma var mı? Setler ve bireyler açısından ayrımı düşünüyorum. Dolayısıyla, varlık kümeleriyle ilgilenen yöntemler, Tablo sınıfına girer ve yalnızca tek varlıklarla ilgilenen yöntemler Entity sınıfına gider. Ama görüyorum ki bu, bazı önemsiz kod organizasyonlarından çok daha fazlasını gerçekleştirmiyor. – Ethan

+0

Öğe belirleyicilerine yapılan çağrılar **, tablo nesnesine delege alamaz ve alma gerçekleştirmez. Varlıklar, düz dilsiz veri nesneleridir. RDBMS'de tek bir satır veya belgeye dayalı bir Depolamadaki bir belgeyi temsil ederler. Buradaki nokta sadece kod organizasyonu değil, * ayrıştırma *. Amaç modülerlik ve bu kolay bakım ve tekrar kullanılabilirliktir. 10 tuğladan yeni bir şey inşa edebilirsiniz, yapıştırırsanız veya birbirine yapıştırırsanız, yapamazsınız, birleştiler ve sıkışmışlar ve daha sonra ayrılmak zor. Aynı yazılım için de geçerlidir. Önerilen okuma: https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882 – burzum

+1

Özetlerdeki ilkelerin ayrılığını anlıyorum ve bunun diğer birçok durum için nasıl geçerli olduğunu görebiliyorum. ama Varlıklar ve Tablolar ile uygulayarak zor bir zaman geçiriyordum.Sanırım şimdi anlıyorum. Varlıklar, v2'nin kullandığı çift "aptal" dizilerin yerine geçer, bu yüzden geldikleri rol çok sınırlıydı. Bir varlığın bir tablodan gelmesi gerekmiyor ve hiçbir şey onun bire kalıcı olmasını gerektirmiyor. Hiçbir zaman bir "id" olabilir, asla "beforeSave()", vb. Sırasında Table sınıfı tarafından uygulanan varsayılan değerleri almazsınız. – Ethan

İlgili konular