¿Cuál es el propósito del objeto de contexto en el constructor DI de cualquier clase? ¿Cómo funciona el contexto?

23

En la mayoría de los constructores de la clase, se pasa un objeto de contexto. No podía entender cómo funciona este Contexto Obj. También noté que a veces esto se pasa al constructor de la clase principal como a continuación.

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

¿Puede explicar cómo funciona este objeto de contexto específico?

aprendiz
fuente

Respuestas:

30

Tenga en cuenta que hay diferentes objetos de contexto, en este caso, \Magento\Framework\App\Action\Contexty para comprenderlo, debe leerlo como "ActionContext". Representa el contexto de aplicación en el que se ejecuta la acción. En otras palabras, le da acceso a todos los objetos con estado de aplicación que necesita una acción del controlador, por ejemplo, el registro o el objeto de solicitud.

Las clases de contexto no tienen funcionalidad propia, son solo un contenedor para otros objetos. Puede verlos como acceso directo para no tener 20 parámetros en cada acción del controlador. Todos los parámetros comunes se fusionan en el objeto de contexto.

Fabian Schmengler
fuente
¿Cómo podría saber qué objeto contienen diferentes $context?
LucScu
@LucaS mira su código fuente. Encontrará las clases contenidas en el constructor de contexto
Fabian Schmengler
15

Los objetos de contexto se introdujeron para aislar a los desarrolladores externos de los cambios en los constructores de clases abstractas.

En Magento 1, las clases abstractas con mucho comportamiento "auxiliar" se consideraban una API conveniente para el extensor de clase. Esto causó un gran número de métodos y dependencias implícitas en las clases abstractas ( AbstractModel, AbstractBlock, AbstractAction)

En Magento 2, se desaconsejan las API basadas en herencia (más precisamente SPI), pero todavía existen muchas API heredadas. Inicialmente planeamos eliminar gradualmente el comportamiento extra de las clases abstractas. Y para no romper todos los extensores cuando eliminaríamos alguna dependencia del constructor, introdujimos objetos de contexto.

El plan actual es abandonar las API basadas en herencia con las API basadas en interfaz en algún momento.

Anton Kril
fuente