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.