magento2中文教程之工厂方法介绍:Factories
《Magento2.X企业级开发实战》
工厂是实例化不可注入类的服务类,即表示数据库实体的模型。 它们在 ObjectManager 和业务代码之间创建了一个抽象层。
与 ObjectManager 的关系
Magento\Framework\ObjectManager 是负责在 Magento 应用程序中实例化对象的类。 Magento 禁止在你的代码中依赖和直接使用 ObjectManager。
工厂是此规则的一个例外,因为它们需要 ObjectManager 实例化特定模型。
以下示例说明了简单工厂和 ObjectManager 之间的关系:
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Framework\App\Config;
use Magento\Framework\ObjectManagerInterface;
use Magento\Framework\Simplexml\Element;
use Magento\Framework\App\Config\Base;
class BaseFactory
{
/**
* @var ObjectManagerInterface
*/
protected $_objectManager;
/**
* @param ObjectManagerInterface $objectManager
*/
public function __construct(ObjectManagerInterface $objectManager)
{
$this->_objectManager = $objectManager;
}
/**
* Create config model
*
* @param string|Element $sourceData
* @return Base
*/
public function create($sourceData = null): Base
{
return $this->_objectManager->create(Base::class, ['sourceData' => $sourceData]);
}
}
书写工厂
除非您需要工厂类的特定行为,否则您不需要显式定义它们,因为它们是自动生成的类类型。 当您在类构造函数中引用工厂时,如果工厂类不存在,Magento 的对象管理器会生成工厂类。
工厂遵循命名约定 Factory 其中 是工厂实例化的类的名称。
例如,自动生成的 Magento\Cms\Model\BlockFactory 类是一个实例化类 Magento\Cms\Model\Block 的工厂。
使用工厂
您可以使用依赖注入为特定模型获取工厂的单例实例。
以下示例显示了通过构造函数获取 BlockFactory 实例的类:
function __construct ( \Magento\Cms\Model\BlockFactory $blockFactory) {
$this->blockFactory = $blockFactory;
}
在工厂上调用 create() 方法会为您提供其特定类的实例:
$block = $this->blockFactory->create();
对于需要参数的类,自动生成的 create() 函数接受它传递给 ObjectManager 以创建目标类的参数数组。
下面的示例显示了通过将参数数组传递给工厂来构造 \Magento\Framework\FlagFactory 对象:
$flag = $this->flagFactory->create([
'data' => ['flag_code' => 'something']
]);
Flag 类有一个 $data 构造函数参数,它对应于上面创建数组中的数据键。
接口
工厂足够聪明,可以解决依赖关系,并允许您获取模块的 di.xml 中定义的接口的正确实例。
例如,在 CatalogInventory 模块中,di.xml 文件包含以下条目:
<preference for="Magento\CatalogInventory\Api\Data\StockItemInterface" type="Magento\CatalogInventory\Model\Stock\Item" />
它指示 Magento 在使用 StockItemInterface 的任何地方使用特定的 Item 类。 当该模块中的类包含工厂 StockItemInterfaceFactory 作为依赖项时,Magento 会生成一个能够创建特定 Item 对象的工厂。
本文来源于:【Magento中文网】,并添加本文地址链接。
如未按上述操作复制或转载,本站有权追究法律责任。
若本站内容侵犯了原著者的合法权益,可联系我们进行处理。