插件框架详解

插件就是模块,功能扩展。
基本框架如下:
插件框架详解_第1张图片

etc/module.xml   //插件配置文件
composer.json    //插件依赖,用来打包上传
registration.php   //插件注册文件

这几个文件是必须的。

因为我目前的项目是magento2demo,所以我的项目插件为Zou_Demo.
也就是把针对该项目的所有修改(针对php逻辑代码部分)都放在Zou_Demo插件里。

Zou  -> 公司名
	Demo  -> 插件名
    	Block  -> 块
        Controller -> 控制器
        etc	-> 配置文件
        	adminhtml	-> 后台配置文件
            	routes.xml	->后台路由
            frontend	-> 前台配置文件
            	routes.xml	-> 前台路由
            config.xml	-> 默认配置数据
            module.xml	->模块配置
       	Helper	-> 帮助(helper)类
        	Data.php -> 默认帮助类
        i18n	-> 插件翻译文件
        	zh_Hans_CN.csv	-> 中文翻译文件
        Model	-> 模型类
        Setup	-> 数据库安装以及升级脚本数据
        	InstallData.php	-> 默认设置和默认数据的增删改	(第一次安装生效)
            UpgradeData.php	-> 版本升级后的默认设置和数据的增删改
            InstallSchema.php	-> 表和字段相关的增删改 (第一次安装生效)
            UpgradeSchema.php 	-> 版本升级后的表和字段相关的增删改
        view	-> 视图文件
        	frontend	-> 前台
            	layout	-> 布局xml
                templates	-> 模版
                web	-> js/css/图片/字体等
        composer.json	-> 插件composer依赖
        registration.php -> 插件注册

可以发现,这个插件就相当于是一个非常独立的网站模块了,MVC架构,自带翻译+数据库+js/css等。

有几点要注意下:

关于建表, 2.3.x里开始用声明式架构 (db_schema.xml)来建了,https://devdocs.magento.com/guides/v2.3/extension-dev-guide/declarative-schema/
当然下面说的Setup方法也是可用的,冒得问题,放心大胆用即可。
你也可以用2.3.x提供的命令来把下面Setup里的php建表代码转换成db_schema.xml。

module.xml里有schema_versionsetup_version
这2个是什么东西呢?

  1. schema_version对应Setup目录下面的InstallSchema.phpUpgradeSchema.php,主要是数据库表和字段相关的操作。
  2. setup_version对应Setup目录下面的InstallData.phpUpgradeData.php,主要是属性相关的操作。

举个例子,
老板要我做一个推荐插件,根据用户购买习惯推荐产品给他。
你肯定要建一个表,来保存对应关系。
你还要给插件设置一个版本号(比如1.0.0版本),方便以后升级维护。

那么,你创建表的代码就应该写在InstallSchema.php里。
版本号写在schema_version,为schema_version = "1.0.0"

老板又说,我们应该给插件加一些演示数据,可以更直观,免得别人不知道怎么用。
那么这些演示数据应该写在InstallData.php里。
版本号写在setup_version,为setup_version = "1.0.0"

嗯,插件上线了,用了一段时间,老板又说还要加点东西,还得加个统计表,后台分析。也得加些默认设置和演示数据。

现在等于是插件要升级了,所以我们要改下版本号,好让系统更新最新数据。

版本号改成了1.1.0,
创建新表的代码就应该写在UpgradeSchema.php里,
版本号写在schema_version,改为schema_version = "1.1.0"

新的演示数据应该写在UpgradeData.php里。
版本号写在setup_version,为setup_version = "1.1.0"

嗯,好了,插件升级到了1.1.0版本,上线了几个月,老板又要加表/加功能/改字段。

那么以后该插件的数据库表和数据相关的升级,都写在
UpgradeSchema.phpUpgradeData.php里。

你会觉得太麻烦了,为啥不能直接写在一个文件里呢?
为什么要分schema_versionsetup_version
为什么要有InstallData.php,UpgradeData.php,InstallSchema.php,UpgradeSchema.php

太他妈麻烦了。数据库相关的操作不能直接写在一个文件里吗?

嗯,可以的。
刚出炉的插件的数据库脚本写在InstallSchema.php里。
后续升级的数据库脚本都写在UpgradeSchema.php里。

其实
InstallData.php跟,InstallSchema.php
UpgradeData.phpUpgradeSchema.php
没有严格的区分,基本上是通用的。

只要schema_versionsetup_version的版本号一致就行。都设一样。
比如插件升级到2.0.0版本了。那么schema_version = "2.0.0"setup_version = "2.0.0"
搞一样就行了。

执行命令

php bin/magento setup:upgrade

就会自动更新。

至于UpgradeSchema.php里的代码怎么写?
插件实战

参考这篇文章,更深入:
https://inviqa.com/blog/using-setup-scripts-magento-2

另外插件的版本号都记录在setup_module表里,如果你想要重新安装插件执行InstallData.php或者InstallSchema.php里的数据的话,需要去setup_module表里删掉当前插件的记录,然后执行
php bin/magento setup:upgrade

继承类

插件里包括 block,hepler,model,controller,widget
我想知道这几个代码里应该继承哪个类?
按照m2的做法,一般这样继承

block

继承 \Magento\Framework\View\Element\Template 类。
比如

hepler

继承 \Magento\Framework\App\Helper\AbstractHelper 类。
比如

model

这个没有强制性要求,最终继承的是 \Magento\Framework\DataObject 类。
比如

controller

控制器分前台控制器和后台控制器,不一样,因为后台控制器是在后台操作的,需要权限验证,
前台控制器 继承 \Magento\Framework\App\Action\Action 类
比如

后台控制器 继承 \Magento\Backend\App\Action 类
比如

widget

widget其实本质就是block,用于前台显示的,继承 \Magento\Framework\View\Element\Template类。
我们项目里一般很少用widget,这个东西要在后台widget里设置,太灵活,比较繁琐,一般开发中用的不多。

你可能感兴趣的:(magento2,magento2插件)