Apa tujuan Objek Konteks dalam DI konstruktor kelas mana saja? Bagaimana Konteks bekerja?

23

Di sebagian besar konstruktor kelas, objek konteks dilewatkan. Saya tidak bisa mengerti bagaimana Obj Konteks ini bekerja. Saya juga memperhatikan bahwa kadang-kadang ini diteruskan ke konstruktor kelas induk seperti di bawah ini.

public function __construct(
    \Magento\Framework\App\Action\Context $context,
    \Magento\Catalog\Model\Design $catalogDesign,
    \Magento\Catalog\Model\Session $catalogSession,
....
    parent::__construct(
        $context,
        $layoutFactory,

Bisakah Anda jelaskan bagaimana objek konteks khusus ini bekerja?

pelajar
sumber

Jawaban:

30

Perhatikan bahwa ada objek Context yang berbeda, dalam hal ini \Magento\Framework\App\Action\Contextdan untuk memahaminya, Anda harus membacanya sebagai "ActionContext". Ini mewakili konteks aplikasi di mana tindakan dijalankan. Dengan kata lain, ini memberi Anda akses ke semua objek dengan status aplikasi yang diperlukan tindakan pengontrol, misalnya registri atau objek permintaan.

Kelas konteks tidak memiliki fungsi sendiri, mereka hanya sebuah wadah untuk objek lain. Anda dapat melihatnya sebagai pintasan untuk tidak memiliki 20 parameter di setiap tindakan pengontrol. Semua parameter umum digabungkan dalam objek konteks.

Fabian Schmengler
sumber
bagaimana saya bisa tahu objek mana yang dikandung oleh berbeda $context?
LucScu
@ LucaS melihat kode sumbernya. Anda menemukan kelas yang terkandung dalam konstruktor konteks
Fabian Schmengler
15

Objek konteks diperkenalkan untuk mengisolasi pengembang pihak ketiga dari perubahan konstruktor kelas abstrak.

Di Magento 1, kelas abstrak dengan banyak perilaku "pembantu" dianggap sebagai API yang nyaman untuk kelas extender. Hal ini menyebabkan sejumlah besar metode dan dependensi implisit dalam kelas abstrak ( AbstractModel, AbstractBlock, AbstractAction)

Di Magento 2 API berbasis warisan (lebih tepatnya SPI) tidak disarankan, tetapi banyak API warisan yang masih ada. Awalnya kami berencana untuk secara bertahap menghapus perilaku ekstra dari kelas abstrak. Dan untuk tidak menghancurkan semua ekstender ketika kami akan menghapus beberapa dependensi dari konstruktor, kami memperkenalkan objek Context.

Rencana saat ini adalah meninggalkan API berbasis warisan dengan API berbasis antarmuka di beberapa titik.

Anton Kril
sumber