magento2中文教程之工厂方法介绍:Factories

7天成为Magento系统架构师,现在开始学习Magento全栈开发!

《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中文网】,并添加本文地址链接。
如未按上述操作复制或转载,本站有权追究法律责任。
若本站内容侵犯了原著者的合法权益,可联系我们进行处理。