Magento 2

Quando devemos usar um repositório e uma fábrica no Magento 2?

Mesmo que tanto os Repositórios quanto as Fábricas nos permitam acessar uma Entidade, acho que devemos nos concentrar em sua responsabilidade.

Da documentação do Magento: “As fábricas são classes de serviço que instanciam classes não injetáveis, ou seja, modelos que representam uma entidade de banco de dados. Elas criam uma camada de abstração entre o ObjectManager e o código de negócios.”

Do artigo de Alan Storm: “Um objeto de repositório é responsável por ler e gravar suas informações de objeto em um armazenamento de objetos”

Minha interpretação é: Se nosso propósito é trabalhar com objetos não injetáveis (chamados “novos”), devemos usar Fábricas; se nosso foco for pesquisar/ler/escrever objetos dentro de um armazenamento de objetos, devemos usar Repositórios.

Se existe um repositório e ele faz bem o que você precisa, sempre prefira o repositório.

Os repositórios fazem parte dos Contratos de Serviço (são implementações de interfaces em Api), ou seja, são uma interface pública para outros módulos.

Use repositórios para carregamento completo

$model->load() não faz parte do contrato de serviço.

Eu tinha uma pergunta sobre esse tópico específico, você pode achar as respostas úteis: Existe alguma razão para preferir $model->load() sobre contratos de serviço?

Use Factories para criar novas entidades

Os repositórios não vêm com métodos para criar uma nova entidade, então, nesse caso, você precisará de uma fábrica. Mas use a fábrica para a interface, como Magento\Catalog\Api\Data\ProductInterfaceFactory – ela criará a implementação correta com base na configuração da DI.
Em seguida, use o método repository->save() para salvá-lo.

Use Factories de Coleta se precisar de mais controle

O seguinte não é a melhor prática oficial do Magento, mas atualmente, os repositórios não dão a você um controle preciso sobre o que carregar.

A API de critérios de pesquisa permite definir filtros, mas, por exemplo, não há como selecionar atributos EAV específicos ou especificar quais tabelas de índice devem ser unidas.

Esses são detalhes de implementação, ocultos das APIs do contrato de serviço, mas geralmente esses detalhes de implementação são importantes e você obtém um desempenho ruim se ignorá-los.

Por esse motivo, assim que os repositórios estão me limitando, não hesito mais em usar as coleções subjacentes.

 

Post Recentes

YouTube sem cookie: adiar o embed do vídeo e do Maps até o aceite

Seu banner de consentimento está certo, mas o vídeo incorporado grava cookie de terceiro no primeiro carregamento. Troque o domínio…

8 horas atrás

Custom post type dando 404: flush_rewrite_rules na ativação do plugin

A listagem do custom post type abre e o single dá 404 no WordPress 6.9. Entenda o cache das rewrite…

2 dias atrás

systemd timer no lugar do cron: agendar script com log e sem execução dupla

Um par .service e .timer substitui a linha do crontab com log no journal, execução perdida recuperada no boot e…

2 dias atrás

Descrição em massa no WooCommerce: wp eval-file lendo a lista de SKUs

400 produtos importados do fornecedor com a aba Descrição vazia. Um wp eval-file percorre os SKUs sem texto, grava pelo…

2 dias atrás

Frete grátis no WooCommerce: esconder as outras opções de entrega

Some com PAC e SEDEX da lista quando o frete grátis está disponível, usando woocommerce_package_rates, e limpe o cache de…

3 dias atrás

Erro HTTP no WordPress ao enviar imagem para a biblioteca de mídia

A barra de upload chega no fim e o WordPress devolve só "Erro HTTP". Separe as três causas: Imagick barrado…

3 dias atrás