Design Pattern Factories

Factories são classes de serviços que instanciam classes não injetáveis, isto é, models que representam a entidade do banco de dados. Eles criam uma camada de abstração entre o Object Manager e a lógica de negócio.

Relacionamento com o Object Manager

O Magento\Framework\ObjectManager é uma classe responsável por instanciar objectos na aplicação Magento. Magento proíbe o depender e usar diretamente o Object Manager no código.

Factories são uma exceção para esta regra, porque eles requerem o Object Manager para instanciar models específicas.

O exemplo abaixo ilustra o relacionamento entre uma factory simples e o Object Manager

namespace Magento\Framework\App\Config;

class BaseFactory
{
  /**
   * @var \Magento\Framework\ObjectManagerInterface
   */
  protected $_objectManager;

  /**
   * @param \Magento\Framework\ObjectManagerInterface $objectManager
   */
  public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager)
  {
    $this->_objectManager = $objectManager;
  }

  /**
   * Create config model
   * @param string|\Magento\Framework\Simplexml\Element $sourceData
   * @return \Magento\Framework\App\Config\Base
   */
  public function create($sourceData = null)
  {
    return $this->_objectManager->create(\Magento\Framework\App\Config\Base::class, ['sourceData' => $sourceData]);
  }
}

Escrevendo Factories

A menos que você necessite de um comportamento específico para suas factories, não é necessário defini-las explicitamente, pois elas são geradas automaticamente. Quando você faz referência a uma factory em um construtor de classe, o Object Manager do Magento gera a factory se ela não existir.

As factories seguem a convenção de nomenclatura, <class-type>Factory, onde o <class-type> é o nome da classe que foi instanciada como factory.

Por exemplo, a classe Magento\Cms\Model\BlockFactory gerada automaticamente é uma factory que instancia a classe Magento\Cms\Model\Block

Usando Factories

Você pode obter a instância Singleton de uma factory para um model específico usando Injeção de Dependência.

O exemplo a seguir mostra uma classe pegando a instância do BlockFactory através do construtor:

function __construct ( \Magento\Cms\Model\BlockFactory $blockFactory) {
    $this->blockFactory = $blockFactory;
}

Chamar o método create()em uma factory fornece uma instância de sua classe específica:

$block = $this->blockFactory->create();

Para classes que requerem parâmetros, o create() gerado automaticamente, aceita um array como parâmetros que são transmitidos para a Object Manager.

$resultItem = $this->itemFactory->create([
  'title' => $item->getQueryText(),
  'num_results' => $item->getNumResults(),
]);

Interfaces:

Factories são suficientemente inteligentes para resolver dependências e aceita que você pegue a instância correta de uma interface como definada no di.xml do seu módulo.

Como exemplo, no módulo CatalogInventory, o arquivo di.xml contém a seguinte entrada:

<preference for="Magento\CatalogInventory\Api\Data\StockItemInterface" type="Magento\CatalogInventory\Model\Stock\Item" />

Ele instrui o Magento a usar a classe Item específica onde quer que StockItemInterface for usado.

Para mais informações, veja o link.

Dúvidas? Posta aí!!!

Um abraço.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *