Factories are service classes that instantiate non-injectable classes, that is, models that represent a database entity.
They create a layer of abstraction between the
ObjectManager and business code.
Magento\Framework\ObjectManager is the class responsible for instantiating objects in the Magento application.
Magento prohibits depending on and directly using the
ObjectManager in your code.
Factories are an exception to this rule because they require the
ObjectManager to instantiate specific models.
The following example illustrates the relationship between a simple factory and the
Unless you require specific behavior for your factory classes, you do not need to explicitly define them because they are an automatically generated class type. When you reference a factory in a class constructor, Magento’s object manager generates the factory class if it does not exist.
Factories follow the naming convention
<class-type> is the name of the class the factory instantiates.
For example the automatically generated
Magento\Cms\Model\BlockFactory class is a factory that instantiates the class
You can get the singleton instance of a factory for a specific model using dependency injection.
The following example shows a class getting the
BlockFactory instance through the constructor:
create() method on a factory gives you an instance of its specific class:
For classes that require parameters, the automatically generated
create() function accepts an array of parameters that it passes on to the
ObjectManager to create the target class.
The example below shows the construction of a
Magento\Search\Model\Autocomplete\Item object by passing in an array of parameters to a factory:
Factories are smart enough to resolve dependencies and allow you to get the correct instance of an interface as defined in your module’s
For example, in the
CatalogInventory module, the
di.xml file contains the following entry:
It instructs Magento to use the specific
Item class wherever the
StockItemInterface is used.
When a class in that module includes the factory
StockItemInterfaceFactory as a dependency, Magento generates a factory that is capable of creating the specific