Magento2 API 服务合同设计模式 依赖注入 介绍

公共接口和API

什么是公共界面?

一个公共接口是一组代码,第三方开发者可以调用,实现或构建一个 插件 。Magento保证在没有重大版本更改的情况下,此代码在后续版本中不会更改。

模块的公共接口 标有@api注释。

什么是API?

应用程序编程接口(API)是模块提供给其他模块的一组接口及其实现。

API类型

以下项目被视为API类型:

  • 目录结构
  • 配置文件结构
  • 活动
  • 客户端API
  • 提供者 API (SPI)

目录结构和配置文件结构是API的类型,因为 扩展 开发人员使用它们。开发人员编写配置,并将其 静态文件 放在指定的文件夹中; 因此,如果配置文件结构或目录结构在后续版本中发生更改,则模块和扩展可能会中断。

 

服务合同设计模式

在编程社区中,设计模式是编写代码的推荐方式,包括何时使用或不使用模式。将 设计模式 视为具有条件的最佳实践。

服务契约的设计模式告诉您要定义哪些类型的接口,以及定义和实现这些接口的方式和位置。

服务合同数据接口现在是可变的。

接口类型和位置

一个 服务合同 必须定义数据接口,保持数据的完整性和服务接口,其中隐藏服务请求者的业务逻辑。

数据接口定义函数,这些函数返回有关数据实体的信息,返回搜索结果,设置验证规则并返回验证结果。您必须在模块Api / Data子目录中 定义服务协定的数据接口 。

服务接口包括管理,存储库和 元数据 接口。您必须在模块Api子目录中定义服务协定的服务接口

数据接口

模块Api / Data子目录中定义数据接口

例如,Customer模块的数据接口位于/ app / code / Magento / Customer / Api / Data子目录中。

数据搜索结果界面

将搜索条件传递给getList()呼叫时,将返回搜索结果界面以及搜索结果。

您必须为每个数据实体定义一个接口以 进行类型提示。也就是说,getItems()函数 CustomerSearchResultsInterface返回一个CustomerInterface数据实体数组GroupSearchResultsInterface,该getItems()函数返回一个GroupInterface数据实体数组

 

服务接口

服务接口包括几个接口子类型:

  • 存储库接口
  • 管理界面
  • 元数据接口

对于文件名和编码标准,请遵循定义的PHP编码标准

将服务接口放在模块的顶级Api目录中

存储库接口

存储库接口提供对持久数据实体的访问。

例如,Customer模块的持久数据实体包括Customer,Address和Group。因此,Customer模块的存储库接口是:

  • CustomerRepositoryInterface
  • AddressRepositoryInterface
  • GroupRepositoryInterface

存储库接口必须提供以下功能:

功能描述

save(data entity interface)

如果未指定ID,则创建记录。

如果指定了ID,则更新指定ID的记录。

get(id)

按ID执行数据库查找。

返回数据实体接口,例如CustomerInterfaceAddressInterface

getList(search criteria)

执行搜索与指定搜索条件匹配的所有数据实体。

返回一个搜索结果界面,可以访问该组匹配项。

delete(data entity interface)

删除指定的实体。实体包含密钥(ID)。

deleteById(id)

按键(ID)删除指定的实体。

 

每个数据实体都有一个相应的接口。因此,get()例如,相应接口中函数可以返回确切的类型。

管理界面

管理界面提供与存储库无关的管理功能。例如:

接口描述

AccountManagementInterface

定义createAccount()changePassword()activate(),和isEmailAvailable()功能。

AddressManagementInterface

定义validate()验证地址函数。

 

依赖注入

Magento 2使用依赖注入来替换MageMagento 1.x中类提供的功能

依赖注入是一种设计模式,它允许对象A将其依赖关系声明为提供这些依赖关系的外部对象B. A声明的依赖关系通常是类接口,而依赖关系B提供的依赖关系是这些接口的具体实现。

这允许代码的松散耦合,因为对象A不再需要关心初始化它自己的依赖性。对象B基于配置或期望的行为决定向对象A提供哪些实现。

这是扩展开发人员理解的一个重要概念,因为它构成了Magento如何组成其类的基础。

依赖倒置原则

遵循依赖性反转原则并在代码中使用抽象来减少代码依赖性。这意味着您的高级类应该使用低级类的接口,而不是直接使用它们。

当Magento更改这些接口的底层实现时,在代码中使用接口可以降低不兼容性错误的风险。它还可以让您专注于类的功能而不是它的实现方式。

由于Magento代码库遵循此原则,因此您可以使用该di.xml文件将自己的Magento接口实现映射到依赖类或服务

对象管理器

ObjectManager是一个Magento服务类,它在引导过程开始时实例化对象。

Magento使用类构造函数签名来检索有关对象的构造函数依赖项的信息。构造类时,对象管理器将类的依赖项(在di.xml文件中定义)注入到类构造函数中。

由于对象管理器间接提供其服务,因此您的类不应依赖于ObjectManager对象本身。唯一的例外是具有复杂逻辑和集成测试的自定义工厂,需要进行环境设置。

编译依赖项

Magento使用其代码编译工具收集所有类依赖关系信息并将其存储在文件中。在类创建过程中,对象管理器使用此信息在应用程序中创建具体对象。

代码库中不存在的服务类,

例如: proxiesfactories, and interceptors 在代码或配置中声明的,是在编译器的帮助下生成的。

Magento中使用的注入类型

以下代码示例突出显示了Magento中使用的两种依赖注入:

namespace Magento\Backend\Model\Menu;
class Builder
{
    /**
     * @param \Magento\Backend\Model\Menu\Item\Factory $menuItemFactory
     * @param \Magento\Backend\Model\Menu $menu
     */
    public function __construct(
        Magento\Backend\Model\Menu\Item\Factory $menuItemFactory,  // Service dependency
        Magento\Backend\Model\Menu $menu  // Service dependency
    ) {
        $this->_itemFactory = $menuItemFactory;
        $this->_menu = $menu;
    }

    public function processCommand(\Magento\Backend\Model\Menu\Builder\CommandAbstract $command) // API param
    {
        // processCommand Code
    }
}

  

  • 构造函数注入在代码示例中,Builder类在其构造函数中声明其对Factory和Menu类的依赖性。Magento使用di.xml文件来确定要注入Builder类的实现。可选的依赖项可选依赖项是您的类用于特定方法和方案的对象。如果实例化类的代价很高,并且您的类并不总是使用它,请考虑使用代理。必须对对象的所有可选和必需依赖项使用构造函数依赖项注入。
  • 方法注入在代码示例中,Builder类还依赖于CommandAbstract类的processCommand()方法。方法注入涉及将依赖项作为方法参数传递,以在类逻辑中使用它。当对象需要对无法注入的依赖项执行操作时,请使用方法注入。

依赖类型

注入 

可注入对象是通过依赖注入获得的单件服务对象。对象管理器使用di.xml文件中的配置来创建这些对象并将它们注入构造函数。

只要依赖关系链不循环回原始可注入对象,可注入对象就可以依赖于构造函数中的其他可注入对象。

Newable /非注入 

新的或不可注射的对象是不能注入的对象。它们是通过每次需要时创建一个新的类实例获得的。

瞬态对象(例如需要来自用户或数据库的外部输入的对象)属于此类别。如果您尝试注入这些对象,您将收到一个不完整的,不正确的对象或无法创建该对象的错误。

例如,您不能依赖于模型对象,例如Product,因为您需要提供产品ID或显式请求新的空实例来获取Product对象。由于您无法在构造函数签名中指定此数据,因此Magento无法注入此对象。

为了解决这个限制,可注入对象可以依赖于生成可新对象的工厂

 

 

posted @ 2018-07-18 01:50  徐锅  阅读(1075)  评论(0编辑  收藏  举报