Magento'da yardımcı nedir?
Hangi durumlarda kişi yardımcı olmalı ve kullanılmamalıdır?
Magento'da yardımcı nedir?
Hangi durumlarda kişi yardımcı olmalı ve kullanılmamalıdır?
Yanıtlar:
Teorik olarak asla yardımcıları kullanmamalısınız.
Yardımcılar sadece ilgisiz yöntemlerin koleksiyonlarıdır ve her zaman tekil olarak yaratılırlar.
Bu, temelde bazı ad alanı altında gruplandırılmış fonksiyonlarla (bu durumda sınıf adı) prosedürel programlamadır. Ancak Magento'nun çekirdeğinde yardımcıları bulunduğundan, yöntemlerinizi oraya koyabileceğiniz hiçbir fikre sahip olmadığınız ya da birçok farklı yere (gerek duyduğunuzda, modeller, denetleyiciler, şablonlar) ihtiyaç duyacağınız bir fikir vermeyebilirsiniz.
Onları son çare olarak kullanın.
Ayrıca Magento, çeviri nedenlerinden dolayı her modül için bir yardımcı gerektirir.
Sadece Data.php
her modülde adı verilen bir yardımcı yaratabilir ve boş bırakabilirsiniz.
Sorunun iki yönü var:
Genel olarak, sınıflar adlı ettikten Helper
, Util
ya da benzer adil ve bir sınıf olarak çok mantıklı değil "Ben nerede koymak bilmiyorum bazı işlevlere sahiptir" diyor.
Magento, yardımcıları münferit olarak başlatır ve çekirdek yardımcıların çoğu herhangi bir devlete sahip değildir, bu nedenle yöntemler bir sınıf olmadan static
da olabilir functions
. Bütün bunlar genellikle bir kod kokusu , uygulama tasarımındaki bir kusur olarak kabul edilir .
Marius'un daha önce belirttiği gibi, yardımcıları kendi kodunuz için kullanmanıza gerek yok. Modüle özel çevirileri kullanıyorsanız, modül başına varsayılan bir boş yardımcı oluşturun, aksi halde işe yaramazlar. Modelleri ( Mage_Core_Model_Abstract
veritabanı verilerini temsil etmiyorlarsa genişletmeleri gerekmeyen) veya bağımsız kütüphane sınıflarını tercih edin.
Ancak, "hiç bir zaman yardımcıları kullanmama" konusunda katı olmayacağım ve bunun yerine aşağıdaki gibi sorgu kısayolları için kullanmayacağım:
erişim modülü yapılandırması:
public function getFooBar()
{
return Mage::getStoreConfig('module/foo/bar');
}
Kütüphane dersleri için fabrika yöntemleri
public function getNewFooService()
{
return new \Foo\Service(...);
}
Başka yerler bulabilirsin ama IMHO, modülün yardımcısı böyle şeyler için yeterince iyi .
Çekirdek yardımcılarını tüketmek , oldukça sık yapacağınız bir şeydir.
__()
çeviri yöntemi: Belirli bir modülün çevirisini almak için kullanmanız gerekir Mage::helper('module-alias')->__('string to be translated')
. $this->__(...)
Bir şablon veya blok içinde kullanırsanız ve translate="..."
özniteliği XML dosyalarında kullanırsanız bu dolaylı olarak gerçekleşir.Mage::helper('core')
yöntemler: yerelleştirilmiş tarih, fiyat ve para birimi oluşturma, kaçma ve veri kodlamaMage::helper('tax')
Vergi yapılandırmasından bilgi almanın ve buna göre fiyatları hesaplamanın yöntemleriMage::helper('catalog/image')
Önbelleğe alınmış ve yeniden boyutlandırılmış katalog görüntüleri oluşturmak ve URL'lerini almak için bir arayüz sağlarMage::helper('catalog/product_url_rewrite')->joinTableToSelect()
URL yeniden yazma tablosunu bir ürün toplama sorgusuna ekler.Çekirdek yardımcılarında gizlenmiş birçok (daha fazla veya daha az) kullanışlı işlev vardır, çekirdekte bir yerde kullanılması muhtemel bir özelliğe ihtiyacınız varsa, bir yardımcı yöntemi yeniden kullanıp kullanamayacağınızı kontrol edin.
Genellikle bu yardımcılar vatansız nesnelerdir ve yöntemler sorgu yöntemleridir (yani yan etkileri yoktur).
Fakat Magento her zaman olduğu gibi kendi yazılı olmayan kurallarını ihlal ediyor ve örnek olarak alınmamalıdır. Yardımcıları kullanmayan nasıl bir "iyi" örnek Mage_Catalog_Helper_Product_Compare
bir olan $_itemCollection
sadece bir kez başlatılabilir mülk ve bir $_customerId
bir setter ile değiştirilebilir özelliği. Ekli koleksiyonlara sahip katalogla ilgili birkaç yardımcı bulacaksınız. Bunları kullanan kod için testler yazmak veya farklı bağlamlarda yeniden kullanmak eğlenceli değildir, bu nedenle lütfen bunu evde yapmayın.
catalog/image
Yukarıda belirtilen yardımcı gerçekten yardımcı olmaması gerektiğini bir yardımcı başka bir örnektir. Sen bir ürünü geçmesi gerekiyor init()
o zaman (gibi çeşitli parametreleri ayarlamak, bugünkü durumunu sıfırlar ilk resize()
, setQuality()
) ve sonunda onun ile URL alabilecek __toString()
yöntemle. Bir şablonda kullanıldığında güzel görünüyor, ancak kod çok büyük bir karışıklık ve tek bir anlam ifade etmiyor.
TL; DR:
Reader
ve Writer
aslında modelleri, do (en azından bir dosya kaynak) devlet var. Örneğin, bir CSV dosyasından sipariş durumu verilerini okumak için sth'ye sahip olurdum. Bir OrderStatusCsvReader
model tarafından kullanılan bir OrderStatusUpdater
model. Bu şekilde, "dosyadan veri oku" ve "Magento'daki güncelleme siparişi" ile ilgili endişeleri de
Marius haklı. Bence yardımcılar saçmalık.
Ancak magento teorisinde, her şeyi bir nesnenin durumunu değiştirmeyen, örneğin biçimlendirilmiş fiyat elde eden yardımcılara koymalısınız.
Ama bir yardımcıya koyabileceğiniz her şeyi, bir modele de koyabilirsiniz. Ve test için yardımcı olan bir modelin farklı örneklerini alabilirsiniz.
Magento'da oldukça yeniyim ama bana göre bir Yardımcı Magento'nun bir hizmetle eşdeğer olduğu görünüyor : "farklı amaçlar için tekrar kullanılabilecek bir dizi ilgili yazılım işlevi". Bir modül sunduğu işlevselliği hizmetler aracılığıyla verir. Kullanmaya diğer modülleri davet ettiğiniz işlevler için bir yardımcı kullanın.
Bir model yalnızca doğrudan bir nesnenin durumunu alma veya ayarlama ile ilgili olan veya başka türlü modelin örneklenen nesnesine bağlı yöntemler sağlamalıdır.
Yinelenen kodu (modellerde, şablonlarda, ...) ve bazen sadece gerekli olduklarını önlemek için yardımcı olur.
Mage::getStoreConfigFlag('my/module/enabled')
kontrol etmek için, kontrol etmek istediğiniz her dosyaya benzer bir şey yerleştirebilir veyaMage::helper('my_module')->isEnabled()
faydaları kullanabilirsiniz :
isEnabled()
yöntemini yeniden yazabilirsiniz ; birkaç dosyayı yeniden yazmak yerine, onu kullanan tüm sınıfları etkileyecektir.Mage_Catalog_Model_Product
Yöntemi eklemek için geçersiz kıl getProductArticles()
. Doğru . Yardımcınıza ekleyingetProductArticles(Mage_Catalog_Model_Product $product)
<action method="someMethod"><var helper="module/method" /></action>
Sadece
Data.php
her modülde adı verilen bir yardımcı yaratabilir ve boş bırakabilirsiniz .
PHPUnit'i kullanırken tek bir satır eklemelisiniz :protected $_moduleName = 'My_Module';
foreach
Döngülere koleksiyonlar yükleyen bazı eğitimsel miras kuralları ve her türlü delilik üzerine çalıştım . Bu dehşet verici mantığı bir yardımcıya çarpan etmeyi ve onu yararlı olacak bir nesne önbelleği olarak kullandığımı belirledim ve bir modele yerleştirmekgetModel
yerine yanlışlıkla arayacak olan gelecekteki geliştiricilerin hataları için çok az yer bıraktımgetSingleton
.