Quel est l'objet Context Object dans le constructeur de n'importe quelle classe DI? Comment fonctionne le contexte?

23

Dans la plupart des constructeurs de la classe, un objet Context est passé. Je ne pouvais pas comprendre comment cet objet contextuel fonctionne. J'ai également remarqué que parfois cela est passé au constructeur de la classe parent comme ci-dessous.

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

Pouvez-vous expliquer comment fonctionne cet objet contextuel spécifique?

apprenant
la source

Réponses:

30

Notez qu'il existe différents objets Context, dans ce cas c'est \Magento\Framework\App\Action\Contextet pour le comprendre, vous devez le lire comme "ActionContext". Il représente le contexte d'application dans lequel l'action est exécutée. En d'autres termes, il vous donne accès à tous les objets avec l'état d'application dont une action de contrôleur a besoin, par exemple le registre ou l'objet de demande.

Les classes de contexte n'ont pas de fonctionnalités propres, elles sont juste un conteneur pour d'autres objets. Vous pouvez les voir comme un raccourci pour ne pas avoir 20 paramètres dans chaque action du contrôleur. Tous les paramètres courants sont fusionnés dans l'objet contextuel.

Fabian Schmengler
la source
comment pourrais-je savoir quels objets sont contenus par différents $context?
LucScu
@LucaS regarde leur code source. Vous trouvez les classes contenues dans le constructeur de contexte
Fabian Schmengler
15

Des objets contextuels ont été introduits pour isoler les développeurs tiers des changements de constructeurs de classes abstraites.

Dans Magento 1, les classes abstraites avec beaucoup de comportement "d'aide" étaient considérées comme une API pratique pour l'extension de classe. Cela a provoqué un très grand nombre de méthodes et dépendances implicites dans les classes abstraites ( AbstractModel, AbstractBlock, AbstractAction)

Dans Magento 2, les API basées sur l'héritage (plus précisément les SPI) sont déconseillées, mais de nombreuses API héritées existent toujours. Au départ, nous avions prévu de supprimer progressivement les comportements supplémentaires des classes abstraites. Et pour ne pas casser tous les extenseurs lorsque nous supprimions certaines dépendances du constructeur, nous avons introduit des objets Context.

Le plan actuel consiste à abandonner les API basées sur l'héritage avec des API basées sur l'interface à un moment donné.

Anton Kril
la source