¿Qué son las Factory en Magento 2?

¿Qué son las Factory en Magento 2?

Las clases Factory son aquellas clases generadas automáticamente que nos sirven para crear una nueva instancia de una clase en concreto.

Cuando creamos una nueva instancia de un objeto en PHP lo hacemos de la siguiente manera:

<?php

$objeto = new MiClase();

En el caso de Magento 2, el encargado de instanciar un nuevo objeto es el ObjectManager (El cuál no deberemos usar directamente en nuestro código). Es por ello que existen las clases Factory, de la cuál hablaremos y enseñaremos de qué manera se usan.

Las clases Factory se generan automáticamente, y tienen (por defecto) un método llamado create(). Este método es el que debemos de llamar para crear una nueva instancia de esa misma clase.

Podremos ver las clases Factory generadas en el siguiente directorio dentro del raíz del proyecto:

generated/code/...

Para usar estas clases Factory, debemos añadir la palabra Factory tras el nombre de nuestra clase. Por ejemplo, tenemos la colección de Customers:

Magento\Customer\Model\ResourceModel\Customer\Collection

Si queremos tener acceso a la Factory, debemos llamar a la colección de la siguiente manera:

Magento\Customer\Model\ResourceModel\Customer\CollectionFactory

Para usar esta clase, haremos uso de la inyección de dependencias. Un ejemplo de cómo instanciar una nueva colección de Customers sería el siguiente:

<?php

use Magento\Customer\Model\ResourceModel\Customer\CollectionFactory as CustomerCollectionFactory;

class TestHelper 
{
    /**
     * Data constructor.
     * @param CustomerCollectionFactory $customerCollectionFactory
     */
    public function __construct(
        CustomerCollectionFactory $customerCollectionFactory
    ) {
        $this->customerCollectionFactory = $customerCollectionFactory;
    }
    
    public function testCreate()
    {
        $newCustomerCollection = $this->customerCollectionFactory->create();
    }
}

También, si nuestra clase lo permite, podremos pasar un array con las diferentes propiedades al método create() para asignar valores directamente al instanciar el objeto, sin necesidad de instanciar el objeto y posteríormente hacer uso de cada setter para añadirle los valores. Ejemplo:

$customer = $this->customerFactory->create([
  'data' =>  [
        'name' => 'JL',
        'lastname' => 'Narvaez',
   ]
]);

Usando las clases Factory, podremos tener varias instancias de la colección en la misma clase/función. Por ejemplo podremos hacer lo siguiente:

    
public function testCreate()
{
    /** @var \Magento\Customer\Model\ResourceModel\Customer\Collection $customerCollectionEmail */
    $customerCollectionEmail = $this->customerCollectionFactory->create();
    $customerCollectionEmail->addAttributeToFilter('email', ['like' => '%@business.com']);
    
    /** @var \Magento\Customer\Model\ResourceModel\Customer\Collection $customerCollectionEntity */
    $customerCollectionEntity  = $this->customerCollectionFactory->create();
    $customerCollectionEntity->addAttributeToFilter('entity_id', ['gt' => 5]);
}
    

Jose Luis
Jose Luis
Magento 2 Certified Developer