目录

  1. 第一部分:准备工作与环境搭建

    magento 2.0 开发教程
    (图片来源网络,侵删)
    • 1 系统要求
    • 2 本地开发环境推荐
    • 3 安装 Magento 2
    • 4 开发者模式
  2. 第二部分:Magento 2 核心概念

    • 1 模块化架构
    • 2 依赖注入
    • 3 前端:布局、块、模板
    • 4 配置系统
    • 5 缓存机制
  3. 第三部分:创建你的第一个模块

    • 1 模块基本结构
    • 2 注册模块
    • 3 创建一个简单的 "Hello World" 页面
    • 4 创建一个简单的控制器
    • 5 创建一个简单的 Block 和 Template
  4. 第四部分:数据模型与数据库

    • 1 EAV (Entity-Attribute-Value) 模型简介
    • 2 创建一个简单的数据模型
    • 3 创建一个安装脚本 来创建数据库表
    • 4 使用模型 进行 CRUD 操作
  5. 第五部分:创建与管理后台配置

    magento 2.0 开发教程
    (图片来源网络,侵删)
    • 1 创建一个系统配置选项
    • 2 在模板中获取配置值
    • 3 创建一个自定义配置表单
  6. 第六部分:主题开发

    • 1 主题基本结构
    • 2 注册主题
    • 3 继承与覆盖模板、CSS、JS
    • 4 使用 LESS 进行样式定制
  7. 第七部分:插件与重写

    • 1 插件:非侵入式地修改方法
    • 2 重写:完全替换类或方法
    • 3 何时使用插件,何时使用重写
  8. 第八部分:常用命令行工具

    • 1 bin/magento 命令详解
    • 2 编译、部署、缓存清理等常用命令
  9. 第九部分:调试技巧

    magento 2.0 开发教程
    (图片来源网络,侵删)
    • 1 启用开发者模式
    • 2 使用 Xdebug 进行断点调试
    • 3 查看日志文件
    • 4 使用 print_rvar_dump 的替代品
  10. 第十部分:进阶学习与资源

    • 1 官方文档
    • 2 社区与书籍
    • 3 最佳实践

第一部分:准备工作与环境搭建

1 系统要求

在开始之前,请确保你的服务器或本地开发环境满足 Magento 2 的最低要求。

  • 操作系统: Ubuntu 18.04+, CentOS 7+, Debian 9+, macOS 10.14+, Windows 10 (WSL2 推荐)
  • Web Server: Apache 2.4+ (推荐) 或 Nginx 1.18+
  • PHP: 7.4, 8.0, 8.1 (推荐 8.1)
    • 必需的 PHP 扩展: bcmath, ctype, curl, dom, fileinfo, gd, hash, iconv, intl, libxml, mbstring, mysqli, openssl, pdo, simplexml, soap, tokenizer, xml, xmlwriter, zip
  • 数据库: MySQL 8.0+ 或 MariaDB 10.4+
  • Composer: 用于管理 PHP 依赖包。

2 本地开发环境推荐

对于初学者,强烈推荐使用集成的本地开发环境,它们已经预装并配置好了所有必需的软件。

  • MAMP / WAMP: 适用于 macOS 和 Windows,图形化界面,易于上手。
  • XAMPP: 跨平台,功能强大。
  • Docker: 最专业和灵活的方案,可以使用 magento/magento-cloud-docker 等官方镜像,环境高度一致。

3 安装 Magento 2

这里以命令行方式为例,这是最推荐的方式。

  1. 安装 Composer

    # 下载 Composer 安装脚本
    curl -sS https://getcomposer.org/installer | php
    # 移动到全局路径
    sudo mv composer.phar /usr/local/bin/composer
  2. 创建项目目录

    mkdir magento2 && cd magento2
  3. 使用 Composer 安装 Magento 你需要先获取一个 Magento 访问密钥

    composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition .

    在过程中,Composer 会提示你输入你的 Public Key 和 Private Key。

  4. 设置文件权限和安装

    # 设置正确的文件所有者
    sudo chown -R <your-username>:<your-group> .
    # 设置目录权限
    find var generated pub/static -type f -exec chmod g+w {} +
    find var generated pub/static -type d -exec chmod g+ws {} +
    find app/etc -type d -exec chmod g+ws {} +
    find var/generation -type d -exec chmod g+ws {} +
    bin/magento setup:install \
    --db-host=localhost \
    --db-name=magento2 \
    --db-user=root \
    --db-password=your_db_password \
    --admin-firstname=Admin \
    --admin-lastname=Admin \
    --admin-email=admin@example.com \
    --admin-user=admin \
    --admin-password=admin123 \
    --language=en_US \
    --currency=USD \
    --timezone=America/Chicago \
    --use-secure-admin=1 \
    --base-url=http://localhost/magento2/ \
    --backend-frontname=admin

    注意: 将命令中的数据库信息和 URL 替换为你自己的。

4 开发者模式

开发者模式是 Magento 2 中最重要的模式之一,它会禁用所有缓存,提供详细的错误报告,并允许你实时修改代码而无需重新编译。

bin/magento deploy:mode:set developer

在生产环境中,请务必切换回 production 模式:

bin/magento deploy:mode:set production

第二部分:Magento 2 核心概念

理解这些核心概念是 Magento 2 开发的关键。

1 模块化架构

Magento 2 的所有功能都被封装在模块中,一个模块可以包含控制器、模型、块、模板、配置等,这种结构使得系统非常灵活和可扩展。

2 依赖注入

这是 Magento 2 的核心设计模式,你不需要手动 new 一个对象,而是在类的构造函数中声明你需要的依赖,Magento 的容器会自动为你创建并注入这些依赖。

// 在你的类中
namespace Vendor\Module\Controller\Index;
class Index extends \Magento\Framework\App\Action\Action
{
    protected $_pageFactory;
    // PageFactory 会被自动注入
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $pageFactory
    ) {
        $this->_pageFactory = $pageFactory;
        parent::__construct($context);
    }
    public function execute()
    {
        $page = $this->_pageFactory->create();
        // ... 你的逻辑
        return $page;
    }
}

3 前端:布局、块、模板

Magento 2 的前端渲染遵循一个清晰的流程:

  1. 路由: URL 请求被路由到一个控制器。
  2. 动作: 控制器的动作方法被执行。
  3. 布局: 动作方法会加载一个特定的布局文件(如 layout/catalog_product_view.xml),这个文件定义了页面的结构(哪些块被加载,在什么位置)。
  4. 块: 布局中的每个 <block> 都是一个 PHP 对象,负责处理逻辑和数据准备。
  5. 模板: 每个块都关联一个 .phtml 模板文件,该文件负责将数据渲染成最终的 HTML。

4 配置系统

Magento 2 使用 di.xml, etc/config.xml, etc/*/di.xml 等配置文件来管理整个应用的依赖、路由、事件等,大部分开发工作都涉及到修改或创建这些配置文件。

5 缓存机制

Magento 2 性能强大的一个重要原因是其多级缓存,它缓存配置、布局、页面片段等,在开发者模式下,所有缓存都是禁用的,方便开发,在生产环境中,你需要善用缓存,并学习如何清理特定的缓存。


第三部分:创建你的第一个模块

我们将创建一个名为 Helloworld 的模块,它属于 Vendor 命名空间(你可以替换成你自己的公司名或个人名)。

1 模块基本结构

所有模块都位于 app/code/ 目录下。

# 创建模块目录
mkdir -p app/code/Vendor/Helloworld

2 注册模块

创建文件 app/code/Vendor/Helloworld/etc/module.xml,用于向 Magento 注册这个模块。

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Vendor_Helloworld" setup_version="1.0.0">
        <sequence>
            <module name="Magento_Store"/>
        </sequence>
    </module>
</config>

3 启用模块

在命令行中运行以下命令来启用模块并更新数据库中的模块状态:

bin/magento module:enable Vendor_Helloworld
bin/magento setup:upgrade

你可以通过 bin/magento module:status 来查看模块是否已启用。

4 创建一个简单的控制器

控制器负责处理 URL 请求。

  1. 创建控制器目录和文件 我们将创建一个 Index 控制器,其 URL 将是 helloworld/index/index

    mkdir -p app/code/Vendor/Helloworld/Controller/Index
    touch app/code/Vendor/Helloworld/Controller/Index/Index.php
  2. 编写控制器代码 打开 Index.php 文件,写入以下内容:

    <?php
    namespace Vendor\Helloworld\Controller\Index;
    use Magento\Framework\App\Action\Action;
    use Magento\Framework\App\Action\Context;
    use Magento\Framework\View\Result\PageFactory;
    class Index extends Action
    {
        protected $resultPageFactory;
        // 依赖注入 PageFactory
        public function __construct(Context $context, PageFactory $resultPageFactory)
        {
            $this->resultPageFactory = $resultPageFactory;
            parent::__construct($context);
        }
        public function execute()
        {
            // 获取 Page 对象并返回
            return $this->resultPageFactory->create();
        }
    }

5 创建一个简单的 Block 和 Template

我们需要让控制器渲染一个页面。

  1. 创建 Block Block 是连接控制器和模板的桥梁。

    mkdir -p app/code/Vendor/Helloworld/Block
    touch app/code/Vendor/Helloworld/Block/Helloworld.php

    Helloworld.php 的内容:

    <?php
    namespace Vendor\Helloworld\Block;
    class Helloworld extends \Magento\Framework\View\Element\Template
    {
        // 可以在这里添加获取数据的方法
    }
  2. 创建布局文件 布局文件告诉系统加载哪个 Block 和哪个 Template。

    mkdir -p app/code/Vendor/Helloworld/view/frontend/layout
    touch app/code/Vendor/Helloworld/view/frontend/layout/helloworld_index_index.xml

    helloworld_index_index.xml 的内容:

    <?xml version="1.0"?>
    <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
        <body>
            <referenceContainer name="content">
                <block class="Vendor\Helloworld\Block\Helloworld" name="helloworld" template="Vendor_Helloworld::helloworld.phtml" />
            </referenceContainer>
        </body>
    </page>
    • helloworld_index_index.xml 的命名规则是:<frontname>_<router>_<action>.xml
    • class 指向我们的 Block 类。
    • template 指向我们的模板文件。
  3. 创建模板文件

    mkdir -p app/code/Vendor/Helloworld/view/frontend/templates
    touch app/code/Vendor/Helloworld/view/frontend/templates/helloworld.phtml

    helloworld.phtml 的内容:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Hello World!</title>
    </head>
    <body>
        <h1><?php echo $this->getWelcomeMessage(); ?></h1>
        <p>This is my first Magento 2 module page!</p>
    </body>
    </html>

    注意:为了让 $this->getWelcomeMessage() 工作,我们需要在 Block 中添加这个方法。

  4. 完善 Block 修改 app/code/Vendor/Helloworld/Block/Helloworld.php

    <?php
    namespace Vendor\Helloworld\Block;
    class Helloworld extends \Magento\Framework\View\Element\Template
    {
        public function getWelcomeMessage()
        {
            return "Welcome to Magento 2!";
        }
    }

6 清理缓存并访问页面

由于我们开启了开发者模式,代码更改会自动生效,如果不是开发者模式,需要清理布局缓存:

bin/magento cache:clean layout

访问你的 Magento 网站,并访问以下 URL: http://your-magento-domain.com/helloworld/index/index

你应该能看到你创建的 "Hello World!" 页面了!


后续部分概述

由于篇幅限制,后续部分将简述其核心内容,你可以根据这个指引深入学习。

第四部分:数据模型与数据库

  • 核心: 学习创建一个 Model 类,它继承自 \Magento\Framework\Model\AbstractModel
  • Resource Model: 创建一个 Resource Model 类,它继承自 \Magento\Framework\Model\ResourceModel\Db\AbstractDb,负责与数据库表交互。
  • 安装脚本: 创建 Setup/Data/Install.php 文件,在模块启用时自动执行,用于创建数据库表。
  • CRUD: 学习如何通过 RepositoryModel 来创建、读取、更新和删除数据。

第五部分:创建与管理后台配置

  • 系统配置文件:etc/adminhtml/system.xml 中定义配置字段,分为 tab, section, group, field
  • 获取配置值: 在 Block 或 Controller 中使用 \Magento\Framework\App\Config\ScopeConfigInterface 来获取配置值。
    $configValue = $this->_scopeConfig->getValue(
        'your_section/your_group/your_field',
        \Magento\Store\Model\ScopeInterface::SCOPE_STORE
    );

第六部分:主题开发

  • 主题结构: 一个主题通常包含 registration.php, theme.xmletc/view.xml
  • 继承: 主题可以继承另一个主题(如 Magento/luma),只修改自己需要覆盖的文件。
  • 覆盖: 只需将需要覆盖的文件从父主题复制到自己的主题目录下相同路径即可。
  • 静态文件: CSS、JS、图片等放在 web/ 目录下。

第七部分:插件与重写

  • 插件: 修改一个方法的前置逻辑、后置逻辑或抛出异常,优点是不需要修改原类,非常灵活。
    • beforeMethod: 在原方法执行前调用。
    • afterMethod: 在原方法执行后调用,可以获取原方法的返回值。
    • aroundMethod: 包裹原方法的执行,可以决定是否执行它。
  • 重写: 完全替换一个类或方法,适用于需要大幅修改或无法通过插件实现的情况,需要在 etc/di.xml 中使用 <preference>

第八部分:常用命令行工具

  • bin/magento setup:upgrade: 更新数据库和安装新的数据。
  • bin/magento setup:di:compile: 编译依赖注入配置,生产环境必需。
  • bin/magento cache:clean [cache_type]: 清理特定类型的缓存。
  • bin/magento indexer:reindex [indexer]: 重建索引,对前台性能至关重要。
  • bin/magento dev:console: 进入 Magento 的交互式命令行,方便调试。

第九部分:调试技巧

  • 开发者模式: 基础中的基础。
  • Xdebug: 强烈推荐!配置好 Xdebug 后,你可以在 VS Code, PHPStorm 等 IDE 中设置断点,进行单步调试。
  • 日志: 使用 \Psr\Log\LoggerInterface 将信息写入 var/log/system.log
    $this->_logger->info('Debug message: ' . $someVariable);
  • 替代品: 在模板中,使用 <?= $block->dump($data) ?> 代替 var_dump,它会以更友好的方式输出数据。

第十部分:进阶学习与资源

  • 官方文档: DevDocs - Magento 2 Developer Documentation 是最权威、最全面的资源。
  • 社区与书籍:
    • Magento Stack Exchange: 解决具体问题的最佳去处。
    • Alan Storm (alanstorm.com): Magento 2 思想和概念的深度解析者。
    • 《Magento 2 Developer's Guide》等书籍。
  • 最佳实践:
    • 始终遵循 Magento 的命名约定和目录结构。
    • 优先使用插件,避免不必要的重写。
    • 保持模块的单一职责原则。
    • 编写可测试的代码。

这份教程为你提供了一个坚实的 Magento 2 开发起点,学习 Magento 2 是一个循序渐进的过程,多动手实践,多阅读官方文档,多参考优秀模块的源码,你很快就能掌握它,祝你开发顺利!