Magento2 创建第一个模块(极简单,即写即现即可用,不需要手动清理复杂的缓存)
新建目录Packge新建目录Packge/Fastmodule新建目录Packge/Fastmodule/etc说明:1 name:Packge_Fastmodule,要求与我们规划的名字一致;到这里,模块建完了,但是在magento里查看不到模块Packge/Fastmodule的。查看方法(以下执行命令的方法一样)是:1 进入magento的根目录,比如(/www/wwwroot/magent
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都会读文件而不用缓存了!
更多推荐

所有评论(0)