Какова цель Объекта контекста в DI конструктора любого класса? Как работает контекст?

23

В большинстве конструкторов класса передается объект Context. Я не мог понять, как работает этот Context 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

Обратите внимание, что существуют разные объекты Context, в этом случае, \Magento\Framework\App\Action\Contextчтобы понять это, вы должны прочитать его как «ActionContext». Он представляет контекст приложения, в котором выполняется действие. Другими словами, он дает вам доступ ко всем объектам с состоянием приложения, которые необходимы для действия контроллера, например, к реестру или объекту запроса.

Классы контекста не имеют собственной функциональности, они являются просто контейнером для других объектов. Вы можете видеть их как ярлык, чтобы не иметь 20 параметров в каждом действии контроллера. Все общие параметры объединяются в объекте контекста.

Фабиан Шменглер
источник
Как я могу узнать, какой объект содержится в разных $context?
LucScu
@ LucaS посмотрите на их исходный код. Вы найдете содержащиеся классы в конструкторе контекста
Фабиан Шменглер
15

Контекстные объекты были введены для изоляции сторонних разработчиков от изменений в конструкторах абстрактных классов.

В Magento 1 абстрактные классы с большим количеством «вспомогательного» поведения считались удобным API для расширителя классов. Это вызвало огромное количество методов и неявных зависимостей в абстрактных классов ( AbstractModel, AbstractBlock, AbstractAction)

В Magento 2 API на основе наследования (точнее, SPI) не приветствуются, но многие устаревшие API все еще существуют. Изначально мы планировали постепенно убирать лишнее поведение из абстрактных классов. И чтобы не сломать все расширители, когда мы удалили некоторую зависимость от конструктора, мы ввели объекты Context.

Текущий план состоит в том, чтобы в какой-то момент отказаться от API на основе наследования с API на основе интерфейса.

Антон Криль
источник