如何在 Magento 2 中创建自定义模块

已发表: 2018-03-19

什么是 Magento 模块?

如您所知,模块是一个目录,其中包含与特定业务功能相关的控制器模型助手等。

为了与 Magento 对最佳模块化的承诺保持一致,一个模块封装了一个功能,并且对其他模块的依赖最小。

模块提供业务功能,支持逻辑,而主题强烈影响用户体验和店面外观。

模块用途

每个模块的目的是通过实现新功能或扩展其他模块的功能来提供特定的产品功能。 每个模块都设计为独立运行,因此包含或排除特定模块通常不会影响其他模块的功能。

在 Magento 2 中,模块将位于 Magento 安装的 app/code 目录中,格式如下:app/code/<Vendor>/<ModuleName>。 现在我们将按照这些步骤创建一个适用于 Magento 2 的简单模块。

创建一个 Magento 2 模块

  1. 创建模块文件夹。
  2. 创建 etc/module.xml 文件。
  3. 创建registration.php 文件。
  4. 运行 bin/magento setup:upgrade 脚本来安装新模块。
  5. 检查模块是否正常工作。

让我们详细了解这些步骤。

第一步:创建模块文件夹

  • Magento 2 中的模块有两个可能的位置:app/code 文件夹和 vendor 文件夹

根据 Magento 2 的安装方式,核心模块可以位于 vendor/magento/magento-* 文件夹(用于 composer 安装)或 app/code/Magento/ 文件夹(用于克隆 github)。

  • 您应该为新模块选择以下哪个位置?

如果为特定项目构建模块,最好选择 app/code 文件夹并提交到项目的存储库。

如果您构建一个要重用的扩展,最好使用 composer 创建它,并将您的模块放在 vendor/<YOUR_VENDOR>/module-something 文件夹中。

Magento 2 中的每个模块名称都由两部分组成——供应商和模块本身,因此您需要定义供应商和模块名称。 对于此示例,我们将供应商命名为“Learning”,将模块命名为“FirstUnit”。

让我们创建文件夹 app/code/Learning 并在此文件夹中放置另一个文件夹:FirstUnit。 如果您使用的是命令行,代码将是:

  1. cd 到根文件夹
  2. mkdir 应用程序/代码/学习
  3. mkdirapp/代码/学习/FirstUnit

确保您有权在安装中创建文件和文件夹。

第 2 步:创建 etc/module.xml 文件

该文件是模块存在所必需的,它包含以下信息:

  • 模块名称
  • 模块版本
  • 依赖项

模块名称由我们刚刚创建的文件夹定义,因为在 Magento 2 中,类名必须遵循文件夹结构。 因为我们创建了文件夹 Learning/FirstUnit,所以我们的模块名称将是 Learning_FirstUnit,属于该模块的所有类都将以 Learning\FirstUnit 开头——例如:Learning\FirstUnit\Observer\Test。

模块版本表示数据库架构和数据的当前版本,用于升级。 例如,假设您决定修改模块中的表模式。 您如何确定此更改将发生在部署代码的所有实例上? 通过直接 SQL 查询更改数据库是行不通的。 相反,Magento 2 在每个模块中都有安装和升级脚本(可选)。 这些脚本包含修改数据库模式或数据的命令。 为了跟踪是否执行脚本,Magento 2 使用模块版本。 每次实施新的数据库更改时,都会实施新版本的模块并更改相应的 module.xml。 Magento 将当前模块的版本保存在数据库中,如果数据库值与 module.xml 中的不匹配,它将执行升级代码。

依赖关系。 如果一个模块依赖于另一个模块,module.xml 文件将有一个特殊声明,该声明定义了当前模块所依赖的模块列表。 对于这个例子,我们将使我们的模块依赖于 Magento_Catalog。

使用以下命令行代码,创建文件夹app/code/Learning/FirstUnit/etc

 mkdir 应用程序/代码/学习/FirstUnit/等

然后创建一个包含以下内容的 XML 文件:

 <?xml 版本="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <模块名称="Learning_FirstUnit" setup_version="0.0.1">
        <序列>
            <module name="Magento_Catalog" />
        </序列>
    </模块>
</配置>

请注意,在我们指定的 XML 文件中:

  • 模块名称:Learning_FirstUnit(基于我们创建的文件夹)
  • 版本:0.0.1(我们模块的初始版本)
  • 依赖关系:Magento_Catalog。 我们可以有多个依赖项。 在这种情况下,我们会将 <module name=".." /> 节点放在序列节点下。

第三步:创建registration.php文件

每个模块都必须有这个文件,它告诉 Magento 如何定位模块。 继续我们的示例,创建文件app/code/Learning/FirstUnit/registration.php 。 然后将以下内容放入其中:

 <?php \Magento\Framework\Component\ComponentRegistrar::register(\Magento\Framework\Component\ComponentRegistrar::MODULE, 'Learning_FirstUnit', __DIR__);

registration.php是一个标准化文件,所有模块都遵循相同的模式。

唯一不同的是模块名称,在我们的例子中是Learning_FirstUnit

第 4 步:运行“setup:upgrade”命令

运行此命令会使您的新模块处于活动状态,并通知 Magento 它的存在。

 php bin/magento 设置:升级

它应该回显大量输出,其中一行应该是Learning_FirstUnit 。 验证这行代码是否存在。

第 5 步:检查新模块是否处于活动状态

到目前为止,我们还没有向我们的模块添加任何有用的代码——它仍然是空的(因此是不可见的)。 为了验证它是否已被识别,请检查文件app/etc/config.php 。 它有一个自动生成的活动模块列表。

切勿手动更改此列表!

 猫应用程序/etc/env.php | grep Learning_FirstUnit

使用这些步骤,您可以在 Magento 2 中成功创建一个新模块。


阅读更多:
如何在 Magento 2 中部署静态内容