Яке призначення контекстуального об'єкта в конструкторі DI будь-якого класу? Як працює Контекст?


23

У більшості конструкторів класу передається об'єкт контексту. Я не міг зрозуміти, як працює цей контекстний Obj. Я також помітив, що іноді це передається конструктору батьківського класу, як нижче.

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

Чи можете ви пояснити, як працює цей конкретний контекстний об'єкт?

Відповіді:


30

Зауважте, що існують різні об'єкти контексту, в цьому випадку це \Magento\Framework\App\Action\Contextі, щоб зрозуміти це, слід прочитати його як "ActionContext". Він представляє контекст програми, в якому виконується дія. Іншими словами, він надає вам доступ до всіх об'єктів із заявою, яка потрібна дії контролера, наприклад, до реєстру або об'єкта запиту.

Контекстні класи не мають власної функціональності, вони є лише контейнером для інших об'єктів. Ви можете бачити їх як ярлик, щоб не було 20 параметрів у кожному дії контролера. Усі загальні параметри об'єднуються в контекстний об'єкт.


як я міг знати, який об’єкт містять різні $context?
LucScu

@LucaS подивіться на їх вихідний код. Ви знаходите вміщені класи у конструкторі контексту
Фабіан Шменглер

15

Об'єкти контексту були введені, щоб ізолювати сторонніх розробників від змін у конструкторах абстрактних класів.

У Magento 1 Абстрактні класи з великою кількістю «помічників» вважали зручним API для розширення класу. Це викликало безліч способів і неявних залежностей в абстрактних класів ( AbstractModel, AbstractBlock, AbstractAction)

У API Magento 2, що базується на спадкуванні (точніше SPI), не відсторонено, але багато застарілих API все ще існують. Спочатку ми планували поступово видаляти зайву поведінку з абстрактних класів. І щоб не розбити всі розширювачі, коли ми видалимо деяку залежність від конструктора, ми ввели об'єкти контексту.

Поточний план полягає в тому, щоб відмовитися від API на основі спадкування з API на основі інтерфейсу в якийсь момент.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.