Apa pembantu di Magento?
Dalam kasus apa seseorang harus menggunakan dan tidak menggunakan pembantu?
Apa pembantu di Magento?
Dalam kasus apa seseorang harus menggunakan dan tidak menggunakan pembantu?
Jawaban:
Secara teoritis Anda tidak boleh menggunakan pembantu.
Pembantu hanyalah kumpulan metode yang tidak terkait dan selalu dipakai sebagai lajang.
Ini pada dasarnya adalah pemrograman prosedural dengan fungsi-fungsi yang dikelompokkan dalam beberapa namespace (nama kelas dalam kasus ini). Tetapi karena Magento memiliki pembantu dalam inti Anda dapat menempatkan metode Anda di sana bahwa Anda tidak tahu di mana harus meletakkannya atau jika Anda perlu memanggil mereka di banyak tempat yang berbeda (model, pengontrol, templat)
Gunakan mereka sebagai pilihan terakhir.
Magento juga membutuhkan penolong untuk setiap modul karena alasan terjemahan.
Anda bisa membuat helper yang dipanggil Data.php
di setiap modul dan membiarkannya kosong.
Pertanyaannya memiliki dua aspek:
Secara umum, memiliki kelas bernama Helper
, Util
atau serupa hanya mengatakan "Saya memiliki beberapa fungsi yang saya tidak tahu harus meletakkan di mana" dan tidak masuk akal sebagai kelas.
Magento membuat instantiates pembantu sebagai lajang dan sebagian besar pembantu inti tidak memiliki keadaan apa pun, sehingga metodenya bisa jadi static
atau bahkan functions
tanpa kelas. Semua ini sering dianggap sebagai bau kode , cacat dalam desain aplikasi.
Seperti yang sudah ditunjukkan Marius, Anda tidak perlu menggunakan pembantu untuk kode Anda sendiri. Cukup buat helper kosong default per modul jika Anda menggunakan terjemahan khusus modul, jika tidak, terjemahan tersebut tidak akan berfungsi. Lebih suka model (yang tidak perlu diperpanjang Mage_Core_Model_Abstract
jika mereka tidak mewakili data basis data) atau kelas perpustakaan independen.
Namun, saya tidak akan terlalu ketat tentang "tidak menggunakan pembantu sama sekali" dan sebaliknya menggunakannya untuk pintasan kueri seperti:
konfigurasi modul akses:
public function getFooBar()
{
return Mage::getStoreConfig('module/foo/bar');
}
metode pabrik untuk kelas perpustakaan
public function getNewFooService()
{
return new \Foo\Service(...);
}
Anda dapat menemukan tempat lain tetapi IMHO, penolong modul sering cukup baik untuk hal-hal seperti itu.
Mengkonsumsi pembantu inti adalah sesuatu yang akan sering Anda lakukan.
__()
metode terjemahan: Untuk mendapatkan terjemahan dari modul tertentu, Anda harus menggunakan Mage::helper('module-alias')->__('string to be translated')
. Ini terjadi secara implisit jika Anda menggunakan $this->__(...)
dalam templat atau blok dan jika Anda menggunakan translate="..."
atribut dalam file XMLMage::helper('core')
metode: tanggal lokal, harga dan pembentukan mata uang, pelolosan dan penyandian dataMage::helper('tax')
metode untuk mendapatkan informasi dari konfigurasi pajak dan menghitung harga berdasarkan ituMage::helper('catalog/image')
menyediakan antarmuka untuk membuat gambar katalog yang di-cache dan diubah ukurannya dan mengambil URL-nyaMage::helper('catalog/product_url_rewrite')->joinTableToSelect()
bergabung dengan tabel penulisan ulang URL ke kueri koleksi produk.Ada banyak fungsi bermanfaat (lebih atau kurang) yang tersembunyi di dalam core helper, jika Anda membutuhkan fungsionalitas spesifik yang kemungkinan akan digunakan di core di suatu tempat, periksa apakah Anda dapat menggunakan kembali metode helper.
Biasanya para pembantu ini adalah objek tanpa negara dan metodenya adalah metode kueri (yaitu mereka tidak memiliki efek samping)
Tapi seperti biasa Magento melanggar aturan tidak tertulisnya sendiri dan tidak boleh dijadikan contoh. Contoh "baik" bagaimana tidak menggunakan pembantu adalah Mage_Catalog_Helper_Product_Compare
yang memiliki $_itemCollection
properti yang hanya dapat diinisialisasi satu kali dan $_customerId
properti yang dapat diubah dengan setter. Anda akan menemukan beberapa pembantu lagi yang terkait dengan katalog dengan koleksi terlampir. Menulis tes untuk kode yang menggunakannya atau menggunakannya kembali dalam konteks yang berbeda tidak menyenangkan, jadi tolong jangan lakukan itu di rumah.
The catalog/image
helper yang disebutkan di atas adalah contoh lain dari pembantu yang benar-benar tidak harus menjadi penolong. Anda harus melewati suatu produk dengan yang init()
pertama me-reset keadaan saat ini, kemudian Anda mengatur berbagai parameter (seperti resize()
, setQuality()
) dan pada akhirnya Anda bisa mendapatkan URL dengan __toString()
metodenya. Itu terlihat bagus ketika digunakan dalam sebuah template tetapi kodenya berantakan dan tidak masuk akal sebagai singleton.
TL; DR:
Reader
dan Writer
model, yang benar-benar melakukan memiliki negara (setidaknya sumber daya file). Sebagai contoh, untuk membaca data status pesanan dari file CSV saya akan memiliki sth. lika OrderStatusCsvReader
model yang digunakan oleh OrderStatusUpdater
model. Dengan cara ini saya juga memisahkan kekhawatiran "baca data dari file" dan "perbarui urutan di Magento"
Marius benar. Saya pikir pembantu tidak masuk akal.
Tetapi dalam teori magento Anda harus meletakkan segala sesuatu menjadi pembantu yang tidak mengubah keadaan suatu objek, misalnya mendapatkan harga yang diformat.
Tetapi semua yang Anda bisa masukkan ke dalam helper, Anda juga bisa dimasukkan ke dalam model. Dan Anda bisa mendapatkan contoh model yang berbeda, yang berguna untuk pengujian.
Saya cukup baru untuk Magento, tetapi bagi saya sepertinya Pembantu adalah setara dengan layanan Magento : "satu set fungsi perangkat lunak terkait yang dapat digunakan kembali untuk tujuan yang berbeda". Modul mengekspor fungsionalitas yang ditawarkan melalui layanan. Gunakan helper untuk fungsi yang Anda mengundang modul lain untuk digunakan.
Model seharusnya hanya menyediakan metode yang berhubungan langsung dengan mendapatkan atau mengatur keadaan objek, atau yang terkait dengan objek instantiated dari model.
Membantu berguna untuk mencegah duplikasi kode (dalam model, templat, ...) dan kadang-kadang hanya diperlukan.
Mage::getStoreConfigFlag('my/module/enabled')
untuk setiap file di mana Anda ingin memeriksa ini, atau Anda gunakan Mage::helper('my_module')->isEnabled()
dengan manfaat:
isEnabled()
metode pembantu dan itu akan memengaruhi semua kelas yang menggunakannya, alih-alih menulis ulang beberapa fileMage_Catalog_Model_Product
untuk menambahkan metode getProductArticles()
. Benar . Di pembantu Anda tambahkangetProductArticles(Mage_Catalog_Model_Product $product)
<action method="someMethod"><var helper="module/method" /></action>
Anda bisa membuat pembantu yang dipanggil
Data.php
di setiap modul dan membiarkannya kosong .
Saat menggunakan PHPUnit Anda harus menambahkan satu baris :protected $_moduleName = 'My_Module';
foreach
loop dan segala macam kegilaan. Saya menemukan memfaktorkan kembali logika yang mengerikan ini kepada seorang penolong dan menggunakannya sebagai objek cache untuk berguna, dan meninggalkan sedikit ruang untuk kesalahan dari pengembang masa depan yang mungkin secara tidak sengaja memanggilgetModel
alih-alihgetSingleton
jika saya menempatkannya dalam model.