Magento2. 如何创建一个Module?

Magento2.x版本已经发布一段时间了,到现在为止已经到2.2了,最新版本可以关注Magento在github上的更新。今天记录下Magento2.1如何创建一个module,直接进入正题。

安装Magento2后,进入项目的根目录后,进入/app目录,只有app/design/,app/etc/两个文件夹,design/目录是存放主题内容,安装成功后,在etc/文件夹下会多出config.php和env.php两个php文件,config.php可以看到magento2加载了那些模块,类似magento1.x的eetc/modules/文件夹,env.php保存了连接的数据库的一些信息,如果你要更改项目连接的数据库,可以在env.php里面修改,类似Magento1.x的local.xml文件。用过Magento1.x,应该发现app目录少了code目录,对头,这里我们也要新建code目录,用来存放我自己编写的模块代码,首先需要创建一个""(这里我用Silk),在这个下,新建我们的""(这里我用Test),目录结构如下所示:

备注:Magento2.1的所有核心代码位于/vendor/magento/目录下。

--magento2.1    |---code          |---Silk               |---Test    |---design    |---etc         |---config.php         |---env.php           

创建好我们的和之后,接下来就需要创建一系列的文件,我们依次来说每个文件如何创建。

模块声明

File:app/code/Silk/Test/etc/module.xml

在module.xml中编写如下代码:

"module" 标签说明 :

  1. name: 表示module的名称

  2. setup_version: 表示module的版本号

Module registration

这里需要在module的根目录下创建一个"registration.php"文件

File:app/code/Silk/Test/registration.php

在registration.php中编写如下代码:

查看module是否激活

打开app/etc/config/php文件后,这时你会发现没有刚才我们编写的module,这里需要利用终端进入到magento2的根目录执行magento命令:

php bin/magento setup:upgrade

执行完成之后,你将会在config.php中看到刚才我们写的module。

接下来,我们就来创建前端控制器。

路由声明

创建前端控制器时,需要新建etc/frontend/routes.xml文件,来声明前端控制器的名称。

File:app/code/Silk/Test/etc/frontend/routes.xml

在routes.php中编写如下代码:

标签说明:

  1. id = standard 表示前端路由;

标签说明:

  1. id : 对于router的唯一标识名;

  2. frontName : 前端URL的控制名称;

标签说明:

  1. name : 声明module的名称;

  2. before : 表示在定义module之前加载;

  3. after : 表示在定义moduel之后加载;

备注:“before” et “after” 在创建module时不是必须的.

创建前端控制器

比如我们的URL为:local.magento2.com/test,继续创建文件

File:app/code/Silk/Test/Controller/Index/Index.php

控制器中代码如下:

resultPageFactory = $resultPageFactory;
parent::__construct($context);
}

/  * @return \Magento\Framework\View\Result\PageFactory */public function execute(){    echo "this is Silk_Test_Controller_Index_Index";    die();}

}
现在访问刚才的路由URL,就可以看到浏览器输出内容了。

备注:这里如果报错:Please upgrade your database: Run "bin/magento setup:upgrade" from the Magento root directory.

解决办法就是到根目录执行命令

php bin/magento setup:upgrade

自定义URL

上面我们的URL很简单,为local.magento2.com/test,实际上magento将它转化成了local.magento2.com/test/index/index,test为/etc/routes.xml下我们定义的frontName名,第一个index是位于Controller文件夹下的Index文件夹名,第二个index是位于Index文件夹下的Index.php名,比如我们现在要我们的URL为:local.magento2.com/test/hello/world,我们该如何创建文件呢?
示例如下:

//File:app/code/Silk/Test/Controller/Helo/World.phpSilk  |---Test       |--Controller            |--Hello                |---World.php

World.php内容如下:

resultPageFactory = $resultPageFactory;
parent::__construct($context);
}

/  * @return \Magento\Framework\View\Result\PageFactory */public function execute(){    echo "this is Silk_Test_Controller_Hello_World";    die();}

}

创建Block

上面我们说了如何从控制器输出内容到页面,但是真正与浏览器页面最相关的还是由对应的Block输出数据,那么如何创建一个block呢?
我们来修改下我们控制器app/code/Silk/Test/Controller/Helo/World.php里面的内容:

namespace Silk\Test\Controller\Hello;
use Magento\Framework\App\Action\Action;

class World extends Action {
/ @var \Magento\Framework\View\Result\Page /
protected $resultPageFactory;
/
@param \Magento\Framework\App\Action\Context $context*/
public function construct(\Magento\Framework\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $resultPageFactory) {
$this->resultPageFactory = $resultPageFactory;
parent::
construct($context);
}

/  * @return \Magento\Framework\View\Result\PageFactory */ public function execute() {    $this->_view->loadLayout();    $this->_view->getLayout()->initMessages();    $this->_view->renderLayout();}

}
接着创建block文件

File:app/code/Silk/Test/Block/Hello.php

Hello.php中代码如下:

创建layout布局文件

布局文件的命名规则为:__

例如:
local.magento2.com/test -----test_index_index.xml
local.magento2.com/test/say -----test_say_index_index.xml
local.magento2.com/test/hello/world -----test_hello_world.xml

这里我们的布局文件名称test_hello_world.xml

File:app/code/Silk/Test/view/frontend/layout/test_hello_world.xml

代码内容如下:

这里我们又定义了一个helloworld.phtml文件,继续来新建这个模板文件。

创建模板文件

File:app/code/Silk/Test/view/frontend/templates/helloworld.phtml

helloworld.phtml代码内容如下:

## HelloWorldCongratulations ! You have created your first Magento Module !The block classname is : 

现在重新刷新我们的网页URL:local.magento2.com/test/hello/world

关键字:php, magento

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部