Magento 2: penggunaan pembantu yang tepat

9

Saya mulai melihat semakin banyak orang yang mendeklarasikan kelas pembantu agar dapat menggunakan yang berikut ini di file templat:

$this->helper('Path/To/Helper/Class')->customMethod();

Jenis kode ini memungkinkan orang menghindari jangan menggunakan pembatasan objek manajer secara langsung tetapi saya cenderung melihat kode yang harus menjadi kode blok di pembantu itu.

Jadi inilah pertanyaanku:

  • apa yang harus ditulis di kelas pembantu?
  • dalam hal apa relevan menggunakan metode pembantu dalam templat?
Raphael di Digital Pianism
sumber

Jawaban:

20

Jangan.
Ini seperti menggunakan ObjectManager::getInstance()->create()dalam template!
Gunakan Blok khusus yang menerima pembantu sebagai ketergantungan konstruktor, dan tambahkan metode proksi yang memanggil metode pembantu.

Dalam templat:

$block->customMethod()

Di blok:

public function __construct(Path/To/Helper/Class $helperClass, ...other dependencies...)
{
    $this->helper = $helperClass;
    // ...other assignments and call to parent::__construct()
}

public function customMethod()
{
    return $this->helper->customMethod();
}

Dalam prinsip OOP berbicara ini menghindari melanggar "Hukum Demeter". Itu merangkum logika bisnis di blok bukan di templat. Sebagai efek samping itu juga membuat logika lebih dapat diuji karena logika dipindahkan ke blok.

Mengenai logika apa yang dimasukkan ke dalam kelas pembantu, saya menemukan bahwa di Magento 2 pembantu kebanyakan masuk akal untuk layanan, seperti sesuatu yang bukan model, tetapi berisi kode yang dapat digunakan kembali, misalnya pemformatan harga (yang terdapat pada inti, tetapi saya dapat pikirkan contoh yang lebih baik saat ini).

Vinai
sumber
Saya setuju dengan prinsipnya, namun sepertinya menggunakan preferensi di.xmluntuk tipe kelas blok, jangan menyimpan beberapa konfigurasi tata letak. Saya mencoba misalnya untuk melakukannya untuk kelas \Magento\Catalog\Block\Product\View\Type\Simple, template default.phtmlyang digunakan dalam template kita diabaikan. Tidak ada petunjuk mengapa saat ini
Sylvain Rayé
2
Masuk ke sini untuk informasi terkini. Pada 2.2, memperpanjang kelas Blok tidak dianjurkan. Alih-alih, jika logika presentasi khusus diperlukan, ViewModel harus didefinisikan dan dideklarasikan sebagai argumen ke Blok di layout.xml. Karena ViewModels dibangun melalui Object Manager, Anda dapat memasang grafik dependensi Anda sendiri tanpa memaparkan diri Anda pada BC yang melanggar perubahan dalam rilis Magento 2. di masa depan
John Hall
1

Saya melihat bantuan sebagai fungsi global di dalam modul Anda (maaf untuk kata 'global'), dan kontrak manajer / layanan sebagai fungsi global yang diizinkan untuk digunakan di dalam maupun di luar modul Anda.

Jika Anda mengikuti prinsip ini, Anda akan melihat ada penggunaan minimal untuk pembantu, saya hanya menggunakannya sebagai pembungkus konfigurasi dalam modul saya.

$this->configHelper->get(Config::PATH_TO_XML_PATH);
$this->configHelper->isEnabled();

Hal semacam ini. Jika Anda memiliki fungsionalitas lain yang mungkin praktis di luar modul Anda, buat manajer sebagai gantinya.

Di dunia yang ideal, pengembang pihak ke-3 yang membutuhkan fungsionalitas modul-modul lain hanya perlu melihat-lihat antarmuka yang tersedia untuk repositori dan manajer dan hal-hal lain di Apifolder.

Giel Berkers
sumber