Magento'da yardımcı nedir?


Yanıtlar:


27

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.phpher modülde adı verilen bir yardımcı yaratabilir ve boş bırakabilirsiniz.


Yardımcılar için bulduğum tek gerçek "kullanım", onların daima bir singleton olmalarını garanti etmeleridir. foreachDö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ştirmek getModelyerine yanlışlıkla arayacak olan gelecekteki geliştiricilerin hataları için çok az yer bıraktım getSingleton.
Luke Rodgers

@LukeRodgers. Amacınızı anlıyorum ama yardımcı olmak için “yanlışlıkla getSingleton yerine getModel'i arayabilirim” diye düşünmüyorum. "Kaydet" yerine "yanlışlıkla" sil "çağırabileceğinizi savunabilirim. Bundan kaçınmak için hangi korumayı sağlayabilirsiniz? Sanırım "dikkat etmek" yazılım geliştirmenin bir parçası.
Marius

Kabul. Bu senaryolarda sanırım sadece insanlığa karşı savunmaya kod yazmaya çalışıyorum.
Luke Rodgers

Çekirdek yardımcılarına özel yöntemler ekleme konusunda nasıl gidersiniz?
tecjam

13

Sorunun iki yönü var:

  1. Kendi yardımcılarımı yazmalı mıyım? Ne için?
  2. Çekirdek yardımcılarını kullanmalı mıyım? Ne için?

1. Yazma yardımcıları

Genel olarak, sınıflar adlı ettikten Helper, Utilya 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 staticda 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_Abstractveritabanı 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 .


2. Yardımcıları kullanma

Çekirdek yardımcılarını tüketmek , oldukça sık yapacağınız bir şeydir.

Örnekler:

  • __()ç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 kodlama
  • Mage::helper('tax') Vergi yapılandırmasından bilgi almanın ve buna göre fiyatları hesaplamanın yöntemleri
  • Mage::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ğlar
  • Mage::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_Comparebir olan $_itemCollectionsadece bir kez başlatılabilir mülk ve bir $_customerIdbir 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/imageYukarı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:

  • Çekirdek yardımcıları faydalı araçlar içerir.
  • Çeviri için yardıma ihtiyacınız var
  • Yardımcılar vatansız olmalı
  • Kendi modüllerinde, yardımcıları çeşitli işlev koleksiyonları olarak kullanmaktan kaçının. Çoğu durumda daha uygun bir yer bulabilirsiniz

Yardımcı programları genellikle düz dosyalara dayalı basit ERP entegrasyonlarında kullandım. Tek yaptıkları, yerel dizinlerden dosya yazmak ve okumak ve diğer nesneleri (ürün, sipariş vb.) Güncellemektir. Söz konusu durumlarda kendi devletlerine veya ilgili tablolarına sahip değiller. Buna ne dersin?
musicliftsme

1
Bu "yan etki yok" u ihlal ediyor. Okuma ve yazma dosyalardır My olağan almak Readerve Writeraslı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 OrderStatusCsvReadermodel tarafından kullanılan bir OrderStatusUpdatermodel. Bu şekilde, "dosyadan veri oku" ve "Magento'daki güncelleme siparişi" ile ilgili endişeleri de
ayırdım

4

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.


2

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.


1

Yinelenen kodu (modellerde, şablonlarda, ...) ve bazen sadece gerekli olduklarını önlemek için yardımcı olur.

  • Özel modülün etkinleştirilip etkinleştirilmediğini 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 :
    • Eğer config yolu bir nedenden dolayı değişirse, sadece bir dosyayı ayarlamanız gerekir.
    • helpers isEnabled()yöntemini yeniden yazabilirsiniz ; birkaç dosyayı yeniden yazmak yerine, onu kullanan tüm sınıfları etkileyecektir.
  • 13 @ @ Özel bir uzantı nasıl yazılır? : Gerekli olmadıkça sınıfları yeniden yazmayın. Gözlemciyi kullanın ve parametre olarak alınan yardımcı yöntemleri ve geçersiz kılmak istediğiniz bir sınıfın örneğini kullanmak mümkün değilse. Yanlış: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)
  • Düzen güncellemelerini kullanarak daha esnek hale getirin <action method="someMethod"><var helper="module/method" /></action>

Sadece Data.phpher 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';

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.