Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
October 25, 2021 12:18 pm GMT

Como sobrescrever arquivos no Magento 2 atravs de preferences

Contextualizando

Magento 2 e a injeo de dependncia

Para entender melhor a injeo de dependncia importante o conhecimento do 5 princpio do SOLID, a Inverso de Dependncia (Dependency Inversion Principle).

chamada de dependncia cada instncia de objeto dentro de uma determinada classe, porque a classe fica dependente da instncia do objeto para ser executada. Para a injeo desta instncia, recomendado, que seja realizado atravs do DIP (Inverso de dependncia).

A Injeo de dependncia um padro de projeto (design pattern) que permite uma classe mantenha um baixo nvel de acoplamento entre diferentes mdulos do sistema, ou seja, permite que uma classe no seja responsvel por criar os objetos dos quais depende.

Object Manager

O Object Manager uma classe de servio do Magento que instancia objetos no incio do processo de bootstrap, gerando e injetando as classes declaradas no arquivo di.xml como dependncias nos construtores das classes instanciadas.

Como o Object Manager fornece seu servio indiretamente, a classe no deve depender do prprio Object Manager. As nicas excees so factories personalizadas com lgica complexa e integraes de testes que necessitam das configuraes de ambiente.

O Magento utiliza sua ferramenta de compilao de cdigo para coletar todas as informaes das dependncias das classes e as armazena em arquivos. Durante o processo de criao das classes, o Object Manager utiliza essas informaes de criao para criar objetos concretos na aplicao.

Classes de servio que no existem no cdigo base, como proxies, factories e interceptors que so declarados no cdigo ou nas configuraes, so gerados com a ajuda do compilador.

O que so as preferncias?

As preferncias (preferences) so utilizadas para indicar a implementao padro das interfaces atravs do Object Manager, caso a interface injetada no construtor de uma classe no tenha sido mapeada com um preference, ao instanciar a classe ser exibido um erro. Para a que o Object Manager faa o mapeamento da interface para a classe, deve-se utilizar o n <preference> no arquivo di.xml, indicando no atributo for qual a interface e no atributo type qual a classe que dever ser sobrescrita e implementar os mtodos determinados pela interface.

A preference no precisa ser utilizada apenas com interfaces, possvel sobrescrever uma classe de outro mdulo, definindo a nova classe globalmente. Para que o Object Manager faa o mapeamento da classe que deve ser sobrescrita, deve-se utilizar o n <preference> no arquivo di.xml, indicando no atributo for qual a classe que ser sobrescrita e no atributo type qual a classe que dever ser sobrescrever, e nesta sobrepor o mtodo com a mesma assinatura (desde que ele seja do publico ou protegido).

Cdigo para sobrescrever arquivos

di.xml

O Object Manager usa a implementao atravs da abstrao mapeando quando a assinatura do construtor de uma classe solicita um objeto por sua interface. O Object Manager utiliza esse mapeamento para determinar qual a implementao padro para a classe de um escopo especfico. Estes tipo de funcionalidade deve ser implementada dentro do arquivo di.xml, seguindo a estruturas de pastas \{Vendor}\{Module}\etc\{area}\di.xml.

<?xml version="1.0"?><config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">    <!-- Override a custom Interface -->    <preference for="{Vendor}\{Module}\Api\Data\{EntityName}Interface" type="{Vendor}\{Module}\Model\{EntityName}" />    <!-- Override a Magento Class -->    <preference for="{Vendor}\{Module}\{Directory}\{ClassToReplace}" type="{Vendor}\{Module}\{Directory}\{ClassReplaced}" /></config>

Interface

O cdigo a seguir se refere a interface de uma entidade que dever receber uma sobrescrio.

<?phpnamespace {Vendor}\{Module}\Api\Data;interface {EntityName}Interface{    public const ATTR_NAME = '{attribute_name}';    public function getMethod(): {type};    public function setMethod(): self;}

Model da Interface

O cdigo a seguir se refere a implementao dos mtodos de uma interface.

<?phpnamespace {Vendor}\{Module}\Model;use {Vendor}\{Module}\Api\Data\{EntityName}Interface;use {Vendor}\{Module}\Model\ResourceModel\{ResourceModelName};class {EntityName} implements {EntityName}Interface{    public function getMethod(): {type}    {        return $this->getData(self::ATTR_NAME);    }    public function setMethod(string $attrName): self    {        return $this->setData(self::ATTR_NAME, $attrName);    }}

Classe a substituir

O cdigo a seguir se refere a sobrescrio do mtodo de uma classe, podendo ser uma classe de qualquer tipo (Block, Controller, Data Provider, Model, Ui Component, Service, etc).

<?phpnamespace {Vendor}\{Module}\{Directory};class {ClassToReplace}{    public function {methodName}(): {type}    {        // Old code here    }}

Classe substituda

O cdigo a seguir se refere a extenso do(s) mtodo(s) de uma classe.

<?phpnamespace {Vendor}\{Module}\{Directory};use {Vendor}\{Module}\{Directory}\{ClassToReplace};class {ClassReplaced} extends {ClassToReplace}{    public function {methodName}(): {type}    {        // New code here    }}

Finalizando

Valores entre chaves ({test}) devem ser alterados na implementao do cdigo.

Habilitando as alteraes

Comando para gerar a configurao das injees de dependncia e todas as classes ausentes que precisam ser geradas (proxys, interceptors, etc).

php bin/magento setup:di:compile

Diretrios e Arquivos

Segue a a lista de diretrios e arquivos que devem ser criados.

- app/  - code/    - {Vendor}/        - {Module}/          - Api/            - Data/              - {EntityName}Interface.php          - etc/            - di.xml            - module.xml          - {Directory}/            - {ClassReplaced}.php          - Model/            - {EntityName}.php          - registration.php          - composer.json

Original Link: https://dev.to/santanaluc94/como-sobrescrever-arquivos-no-magento-2-atraves-de-preferences-384g

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To