Apa pembantu di Magento?

22

Apa pembantu di Magento?

Dalam kasus apa seseorang harus menggunakan dan tidak menggunakan pembantu?

Supersonik
sumber

Jawaban:

27

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.phpdi setiap modul dan membiarkannya kosong.

Marius
sumber
Satu-satunya "penggunaan" nyata yang saya temukan untuk pembantu adalah bahwa mereka dijamin akan selalu menjadi singleton. Saya telah mengerjakan beberapa kode warisan pendidikan yang memuat koleksi dalam foreachloop 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 memanggil getModelalih-alih getSingletonjika saya menempatkannya dalam model.
Luke Rodgers
@LukeRodgers. Saya mengerti maksud Anda, tetapi saya tidak berpikir bahwa "mungkin secara tidak sengaja memanggil getModel alih-alih getSingleton" memenuhi syarat sebagai alasan sebenarnya untuk menggunakan pembantu. Saya berpendapat bahwa Anda dapat "secara tidak sengaja" memanggil "hapus" alih-alih "menyimpan". Perlindungan apa yang dapat Anda lakukan untuk menghindari hal ini? Saya kira "memperhatikan" adalah bagian dari pengembangan perangkat lunak.
Marius
Sepakat. Dalam skenario ini saya kira saya hanya mencoba kode pertahanan terhadap kemanusiaan.
Luke Rodgers
Bagaimana Anda menambahkan metode kustom ke pembantu inti?
tecjam
13

Pertanyaannya memiliki dua aspek:

  1. Haruskah saya menulis pembantu saya sendiri dan untuk apa?
  2. Haruskah saya menggunakan pembantu inti dan untuk apa?

1. Menulis pembantu

Secara umum, memiliki kelas bernama Helper, Utilatau 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 staticatau bahkan functionstanpa 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_Abstractjika 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.


2. Menggunakan pembantu

Mengkonsumsi pembantu inti adalah sesuatu yang akan sering Anda lakukan.

Contoh:

  • __()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 XML
  • Mage::helper('core') metode: tanggal lokal, harga dan pembentukan mata uang, pelolosan dan penyandian data
  • Mage::helper('tax') metode untuk mendapatkan informasi dari konfigurasi pajak dan menghitung harga berdasarkan itu
  • Mage::helper('catalog/image') menyediakan antarmuka untuk membuat gambar katalog yang di-cache dan diubah ukurannya dan mengambil URL-nya
  • Mage::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_Compareyang memiliki $_itemCollectionproperti yang hanya dapat diinisialisasi satu kali dan $_customerIdproperti 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/imagehelper 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:

  • Pembantu inti berisi alat yang berguna.
  • Anda membutuhkan bantuan terjemahan
  • Pembantu harus bernegara
  • Dalam modul Anda sendiri, hindari menggunakan bantuan sebagai koleksi fungsi yang beragam. Dalam kebanyakan kasus, Anda dapat menemukan tempat yang lebih tepat
Fabian Schmengler
sumber
Saya sering menggunakan pembantu dalam integrasi ERP sederhana berdasarkan file datar. Yang mereka lakukan hanyalah menulis dan membaca file dari direktori lokal dan memperbarui objek lain (produk, pesanan, dll.). Mereka tidak memiliki negara atau tabel terkait sendiri dalam contoh yang disebutkan. Apa pendapat Anda tentang ini?
musicliftsme
1
Itu melanggar "tidak ada efek samping". Saya mengambil biasa membaca dan menulis file Readerdan Writermodel, 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 OrderStatusCsvReadermodel yang digunakan oleh OrderStatusUpdatermodel. Dengan cara ini saya juga memisahkan kekhawatiran "baca data dari file" dan "perbarui urutan di Magento"
Fabian Schmengler
4

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.

Fabian Blechschmidt
sumber
2

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.

Patrick van Bergen
sumber
1

Membantu berguna untuk mencegah duplikasi kode (dalam model, templat, ...) dan kadang-kadang hanya diperlukan.

  • untuk memeriksa apakah Anda modul khusus diaktifkan, Anda dapat menempatkan sesuatu seperti Mage::getStoreConfigFlag('my/module/enabled')untuk setiap file di mana Anda ingin memeriksa ini, atau Anda gunakan Mage::helper('my_module')->isEnabled()dengan manfaat:
    • jika jalur konfigurasi berubah karena suatu alasan, Anda hanya perlu menyesuaikan satu file
    • Anda dapat menulis ulang isEnabled()metode pembantu dan itu akan memengaruhi semua kelas yang menggunakannya, alih-alih menulis ulang beberapa file
  • 13th @ Bagaimana cara menulis ekstensi khusus? : Jangan menulis ulang kelas kecuali diperlukan. Gunakan pengamat dan jika itu tidak mungkin untuk menggunakan metode pembantu yang menerima sebagai parameter dan contoh kelas yang ingin Anda timpa. Salah: Override Mage_Catalog_Model_Productuntuk menambahkan metode getProductArticles(). Benar . Di pembantu Anda tambahkangetProductArticles(Mage_Catalog_Model_Product $product)
  • buat pembaruan tata letak lebih fleksibel menggunakan <action method="someMethod"><var helper="module/method" /></action>

Anda bisa membuat pembantu yang dipanggil Data.phpdi setiap modul dan membiarkannya kosong .

Saat menggunakan PHPUnit Anda harus menambahkan satu baris :protected $_moduleName = 'My_Module';

sv3n
sumber