Magento是一套专业开源的电子商务系统,利用PHP + MySQL技术开发,具有灵活性和模块化架构体系,易于与第三方应用系统无缝集成。在实用中,经常需要我们开发新功能,编写模块或插件,本文适用于初学者,创建自己的第一个模块。

一般文档和程序员在增加magento的模块的时候,会习惯用命令行模式来加载,比如命令:

 php bin/magento setup:upgrade

但是这样会使整个magento升级,导致很多问题,比如模板错乱,比如样式不对,需要重新再生成模板或者其它修复工作,本旨在通过即写即现即可用的方式,不需要magento升级或者手动清理缓存,用极简单的方式创建模块,而完全不影响其它模块的正常使用。

由于Magento的命名规范非常严谨,所以我们约定几点:

1 代码书写规则:写代码的时候,需要注意,比如目录结构,比如文件名和类名的字母大小写等,否则可能不被magento识别,无法正常运行。

2 本文要求magento的版本是2.4.5,其它版本的magento,不保证能通过,谢谢!

查看版本命令

本文的目标,是实现一个自定义模块,然后实际访问URL:https://www.XXX.com/fastmodule/contact/useit,看到输出结果 this is Useit,如下图:

说明:

1 www.XXX.com为演示用,需要修改成自己的域名;

下面开始我们的操作。

第1步:模块规划

做事情之前都要进行规划,magento的设计复杂,自然也需要规划,模块规划如下:

  • packagename:Packge
  • modulename:Fastmodule
  • context:Contact
  • classname:Useit

说明:

1 packagename:magento需要为每个模块做定义一个packagename,也叫namespace,可以是个人名字、公司名字等,这里是Packge,注意不是Package,注意大小写,没有什么特别的原因;

2 modulename:模块名字,注意不能与已有的magento模块相同;

3 context:这个是内容名字,也有叫控制器名的,没什么特别解释的;

4 classname:具体的Action的名字;

5 以上注意大小写,一般是第一个字母大写;

第2步:定义模块配置

新建目录Packge

新建目录Packge/Fastmodule

新建目录Packge/Fastmodule/etc

新建文件Packge/Fastmodule/etc/module.xml,内容如下:

<?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="Packge_Fastmodule" setup_version="1.0.0" active="true" />
</config>

说明:

1 name:Packge_Fastmodule,要求与我们规划的名字一致;

到这里,模块建完了,但是在magento里查看不到模块Packge/Fastmodule的。

查看方法(以下执行命令的方法一样)是:

1 进入magento的根目录,比如(/www/wwwroot/magento,每个网站的不一样,以你的为准)

2 php bin/magento module:status

查看不到,如下图:

说明

1 显示已经加载成功的模块;

2 显示没有加载成功的模块;

我们的模块不仅没有被加载,而且连在未加载的列表里都没有,原因是还缺少一个注册文件。

第3步:定义注册文件

新建文件Packge/Fastmodule/registration.php,内容如下:

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Packge_Fastmodule',
    __DIR__
);
?>

说明:

1 name:Packge_Fastmodule,要求与我们规划的名字一致;

这时候,php bin/magento module:status可以看到,但是是未激活:

到这里,说明magento已经发现了这个模块,但是没加载它,那如何加载呢?

第4步:加载模块

我们这里直接修改magento的配置文件,就可以为magento增加模块,而需要再使用升级命令

如下:

1 进入magento的根目录

2  文件app/etc/config.php,增加一行:

'Packge_Fastmodule' => 1,

如下图:

这时候,在命令行里执行命令 php bin/magento module:status 就可以看到模块加上了。

到这里,显示模块被加载了,但是依然是没有正常工作,不能访问的,那如何让模块可以在页面上打开呢?我们还需要做两件事,一是配置路由 route,二是定义控制器 Controller

第5步:配置路由 route

新建目录Packge/Fastmodule/etc/frontend

新建文件Packge/Fastmodule/etc/frontend/routes.xml,内容如下:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="standard">
        <route id="fastmodule" frontName="fastmodule">
            <module name="Packge_Fastmodule" before="Magento_Core"/>
        </route>
    </router>
</config>

这样路由就加好了。

说明:

1 <router id="standard">:表示是前端控制器;

2 <route id="fastmodule" frontName="fastmodule">:这里可以小写,要与访问URLhttps://www.XXX.com/fastmodule/contact/useit中的一致。

3 name:Packge_Fastmodule:要求与我们规划的名字一致;

4 before="Magento_Core":表明是优先执行;

第6步:定义控制器 Controller

新建目录Packge/Fastmodule/Controller

新建目录Packge/Fastmodule/Controller/Contact

新建目录Packge/Fastmodule/Controller/Contact/Useit.php,然后复制下列代码:

<?php
namespace Packge\Fastmodule\Controller\Contact;

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;

class Useit extends Action
{
    protected $resultPageFactory;
    public function __construct(Context $context, PageFactory $resultPageFactory) 
    {
        $this->resultPageFactory = $resultPageFactory;
        parent::__construct($context);
    }


    public function execute()
    {
        echo "this is Useit";
    }
}

这样Action就配置好了,但是我们访问https://www.XXX.com/fastmodule/contact/useit,仍然是会得到404,为什么呢?是因为magento虽然加载了模块,但是并没有激活路由激活Action,所以访问不了,那如何在不执行清缓存命令的情况下激活呢?

下面修改两处代码,直接让magento重新加载,而不需要手动清缓存

第7步:激活路由

1 进行magento根目录

2  打开文件vendor/magento/framework/App/Route/config.php,找到函数getRoutes。

在函数_getRoutes里的$cachedRoutes = $this->_cache->load($cacheId)后,加一行:

// 重新加载路由
$cachedRoutes = null;

如下图:

第8步:激活Action

1 进行magento根目录

2 打开文件vendor/magento/framework/App/Router/ActionList.php,找到构造函数__construct。

在构造函数__construct里的$data = $cache->load($cacheKey);后,增加一行

// 重新加载Action
$data = null;

如下图:

在执行完上述两步之后,magento就会从文件中读取路由和Action,然后写入缓存里了。

这时我们访问https://www.XXX.com/fastmodule/contact/useit,就可以看到结果了。

温馨提示:

增加的这两行代码,是强制magento读取配置文件,magento在读取后,会自动更新缓存,所以,在执行完一次后,可以把这两行代码注释掉或者删掉了!不然每次magento都会读文件而不用缓存了!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐