如何在 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 中部署靜態內容