magento二次开发教程(Magento2新手入门系列)上一节我们在本机安装好了Magento2的本地环境,打开页面看看,打开后台看看其实还挺漂亮对吧
假如你从新启动了机器,你会发现,这些页面又打不开了,别着急,这是因为你的这些环境搭在docker容器里,从启动机子后,docker容器没有启动,所以打不开,你需要进到你的代码安装目录,在本例中是/var/www/MYMAGENTO2,在这里右键打开命令行终端,就是点击鼠标右键,选择”在终端打开”,然后运行命令
docker-compose up
等待一会,等出现下面的字符的时候,就可以去打开页面了
这个时候,表示相关的环境已经启动完毕了,等待你的操作了.
另外,如果你当时没有修改后台地址为admin,也没有记住admin_后面带了一串的字符,那打不开后台页面怎么办?别着急,你进入到配置页面可以看到这一串地址,配置页面在
/var/www/MYMAGENTO2/src/app/etc
在这里有一个env.php 的文件,打开它,在frontName后面就是设置的后台地址.
你把它拼到url里,类似于这样
http://localhost/admin_admin_g5c3tb
这就是后台地址了.
好了,现在提醒注意的两个问题讲完了.我们下来需要讲到magento开发需要用到的docker知识了.
(1) docker相关知识
在上一节我们大致介绍了docker和docker-composer的概念,如果不懂的可以回头去看看,我在这里不打算讲解的逻辑那么严密,那么准确,我要给大家一个比较好理解的概念,在这个好理解的而且没什么明显错误概念上,大家开始自己的学习,然后随着学习的进一步深入,你会对相关知识理解的越来越深刻和完整,对于新手,一上来就扔一大堆的太过于准确和严密的解释,只会让他们望而生畏,事实上我培养过的新手,都是这么走过来的,没有什么问题.
我讲过docker本质上其实是你的机器里的一个隔离环境,你把所有你业务需要的软件都装在这个环境里,然后需要使用的时候启动这个环境,不需要了就停止它,对你的电脑没有其他的影响,干净有序好管理.docker第一次启动时候需要自动来安装你需要的软件环境,它需要知道你到底想装什么.你用一个配置文件告诉它,就是Dockerfile.里面有很多命令,你有兴趣可以去学习下.docker环境一旦安装好后,你可以把这个环境保存为一个镜像文件,然后这个镜像文件就可以传输给其他人用,这个是docker镜像,在https://hub.docker.com/上有很多别人生成好的镜像,你可以去看看.如果你看上那个镜像想使用,你在本地可以用 docker pull 来拉取镜像仓库里的镜像,比如下面这个数据库镜像.
你当然也可以把自己的Dockerfile文件给别人,让他根据你的配置在他本地生成docker容器.docker容器就是用来运行镜像的环境,无论这个镜像是你拉取别人的,还是自己本地生成的.
所以,总结一下:
docker 是软件名称,有时候也指docker容器
docker容器 是用来加载运行镜像的环境
docker镜像 是一系列软件集合的环境.
Dockerfile 是docker镜像的配置文件
好了,如果你觉得麻烦,你只需要记住”docker是一系列软件的容器,与本地环境安全隔离运行”,平时就直接用docker指你运行的那些环境吧.谁也不能说你错!
docker的日常操作其实也很简单,就那几个命令你记住就好.
docker pull [仓库]:[tag] #从远端仓库拉取镜像 docker run [参数] [镜像名 or 镜像id] [命令] #运行本地镜像 docker ps #查看运行中的容器 docker start [镜像名] # 启动容器 docker restart [容器名 or 容器id] # 重启容器 docker kill [容器名 or 容器id] #强制关闭容器 docker rm [容器名 or 容器id] #删除容器 docker rmi [镜像名] #删除镜像 docker run -itd [容器名] /bin/bash #进入docker环境内
其实还有很多docker的命令,对于开发的日常操作,记住以上的这些命令大部分时间就够用了,如果有特殊的需求,百度一下也不费事.
讲完docker操作,其实日常开发除了docker ps我常用来看看容器启动了没有,其他的启动停止等操作,都用docker-compose来操作的.那么什么是docker-composr?
我们的docker容器有时候会有很多,如果你在终端敲入docker ps,你会发现其实Mangeto的这套环境启动了6个docker容器
这6个容器,既相互独立又相互关联,它们有的提供数据库有的提供apache等等,合在一起满足了你的开发需求,如果后期你还有其他的软件需求,你可以增加一个docker,然后通过配置文件,把它们相互关联起来就好了,这个配置文件不同与docker的配置文件Dockerfile,它配置的是各个容器之间的关系,它叫docker-compose.yml,你进入到MYMAGENTO2目录就能看到,读取这个配置文件,然后执行docker容器管理,关联操作的软件就是docker-compose.
如果你没有自己编排docker环境的打算,你只需要记住两个命令:
启动所有相关的docker容器
docker-compose up
停止相关的所有docker容器
docker-compose down
当然,这个命令必须在有docker-compose.yml配置文件的目录下运行,这样它会自动读取相关的配置文件来运行容器.
(2) 项目目录
讲完了docker相关的操作,我们再回到MYMAGENTO2 目录里看看都有些什么文件.
如上图:
elasticsearch是一个全文搜索引擎,在magento中常被用来做产品关键字筛选或者分类数据,elasticsearchdata文件夹存的就是相关数据.
src是代码的主目录,里面就是magento的全部代码,这个在代码结构里会详细讲到.
首先我们应该清楚的一点是,所有的docker容器,要执行里面的命令,修改里面的文件,都需要进入到docker容器里,前面我们介绍了一个进入到docker容器里的命令,在这个目录里很多文件是一个脚本,里面就是放的类似命令,不过有些是用docker命令的方式,有些是用docker-compose的命令方式进入的,有时候进入docker的容器里,打开容器里的bash来执行命令,有时候也可以在本地直接直接docker容器里的命令,只是命令比较长.这些脚本目的是为了方便我们不用记那么一长串的命令.
composer是php的代码依赖管理工具,如果你想要安装一些网络流行的php库或者框架之类,那么编辑一个compose配置文件,然后用composer命令来安装相关依赖,由于我们的代码是下载的,所有没有用到composer.这里的composer是一个脚本,运行脚本是为了方便我们运行docker内的composer文件
docker-compose.elasticsearch.yml和docker-composer都是docker-composer的编排配置文件,上面我们讲过docker-composer,打开docker-composer,你可以清晰的看到多个容器的端口配置,数据映射等等.还记得我们以前说过MYMAGENTO2\src是docker内apache项目运行目录的映射吗?在这个文件中就有配置:
在这里把当前目录下的./src映射为docker容器里的/var/www/html目录了,所以,你用编辑器修改当前目录下的src下的代码,docker容器里的apache项目目录下的代码也会改变,否则的话,你要改个代码还要进入到docker里修改,那多麻烦.
这里的port就是把docker这个容器里的端口和本地的80端口进行映射,所以你在浏览器里请求本地的80端口的时候就实际上请求的是docker容器向外暴露的80端口,因为apache是在docker里安装的,所有docker容器里的apache收到80端口的请求后,它就会起作用.
Dockerfile是apache这个docker容器的配置文件,它定义了apache所在docker需要安装什么软件,在你本地生成容器的时候会读这个文件来生成环境.
grunt是为了方便你进入docker内执行js构建的grunt命令所做的脚本,运行一下就可以执行docker内的前端构建命令
init脚本是为了那些直接从github.com上下载这个项目的人,做容器初始化用的.我们是直接执行的脚本,所以这里不用执行了.
start,stop,kill脚本都是为了方便大家运行docker命令而做的脚本,stop是停止容器,kill则是强行删除,没有从构容器的需要,一般不要kill,kill容器会导致数据丢失的哦.我们也不需要start和stop,我们直接使用docker-compose来启动或者停止容器.
magento和n98是为了magento二次开发过程中,需要通过命令行执行一些刷新缓存命令或者构建索引等需要而简化操作的脚本,其实magento脚本就是直接执行docker内的magento源码目录下bin下的magento.n98是一个magento的工具,也提供了很多命令行方式刷新缓存或者新建模块等的操作.这些我们以后在开发过程中会经常用到.
xdebug是为了大家在开发过程中,方便的启用或者关闭xdebug功能,因为你知道magento本身就很耗费资源的,如果xdebug不到必要的时候启动,那会一直占用很多资源,慢的你会头疼的.
shell脚本里面是一个命令,就是为了大家方便的进入到docker容器里,你在当前目录下运行这个脚本,就可以直接进入到apache的docker容器里,因为容器都是相互关联的,所以其实等于进入了所有相关的开发环境.很多时候我们需要进入容器做一些检查或者增加配置的时候就需要用上它
其他的不太重要的文件就不一一讲了,还有些朋友会问那么php配置,mysql配置这些呢,它们在MYMAGENTO2/.docker/config里,当你在本地构建容器镜像的时候,就会把这些已经配置好的文件拷贝到容器中,如果你修改了并希望从新加载,你就需要从新构建镜像,镜像一旦构建完成,下一次启动时候,就不会从新构建了,而是直接加载存在本地的镜像.
(三)代码目录结构
说了这么多,我们把周围相关的内容都介绍完了,终于要开始介绍magento的代码目录了,但是不能算浪费时间,如果你对周边内容没有一个基本了解,开发过程中你一定会被各种各样的疑问耽误了你的开发思路.
在MYMAGENTO2/src目录下就是magento2的代码,看起来很熟悉对不对?很多框架都差不多这样的结构.
这里的compose文件是magento2的代码依赖管理工具,MYMAGENTO2目录里的哪个是脚本,是为了方便进入docker里执行composer命令.
其他类似文件就不说了,大家一看就知道是什么了.index.php在这里,这是magento的入口文件,如果是apache,那么还要有.htaccess来保证所有的请求都通过index.php来解析.
vendor目录里就是magento框架所有的基础代码,如果你有二开的需求,一般是不修改这里的代码的,你要把你的业务代码放在app下,不用担心,magento有足够的机制来安排谁来替代谁.
app目录下是你所有的业务代码,app/etc下就是所有的配置文件,你可以在这里找到你的数据库配置等.
app/design是开发者的前端主题的代码目录,你可以在这里新建你自己的前端主题,或者修改默认的前端主题代码,默认的主题相关文件是在vendor下的,你大概不想把默认主题改的再也恢复不回去了吧.
在app目录下增加业务逻辑代码应该放在app/code下,格式是app/code/<vendorname>/<modulename>,在你新建的模块里,你可以增加功能,也可以用来覆盖修改框架原有功能.
在app目录同级的bin目录,你看到了吗,这里有个magento文件,它其实是一个php文件,我们前面多次提到了,容器外的代码要进入容器里执行命令行操作,很多其实就是为了在容器里运行这个命令行文件的.它是所有magento命令行操作的入口文件.需要注意的是,ubuntu需要给这个文件增加执行权限,否则,以后你遇到很多执行被拒绝的情况,增加方式就是
#在MYMAGENTO2目录下执行 ./shell #进入到docker容器里,然后进入这个目录 cd /var/www/html/bin #然后给这个文件增加执行权限 chmod +x magento
在app目录同级还有一个generated目录,对我们开发来说,如果你设置的是开发模式,那么magento会把很多的临时文件存在这里,所以你一定要注意这个文件夹的权限问题,不要让magento写不进去东西,那你就惨了.另外,开发时候,你要追代码源头,通常会追到这里,在这里你可以看到一些代码过程的静态化文件,在生产环境,是不用写这个目录的,全部加载在内存中.
还有lib目录里放的一些第三方的库.pub目录里是一些静态资源.
(四) 开初始化准备工作
好了,现在我们回到MYMAGENTO2目录里,我们现在要用到刚才提到的magento脚本来做一些开发初始化操作.
将模式修改为开发模式
./magento deploy:mode:set developer
如果报错:permission denied,按照前面说过的办法,进如docker容器,将magento文件增加执行权限
将代码和数据整合部署
./magento setup:upgrade
生成索引
./magento indexer:reindex
生成缓存文件
./magento cache:flush
好了,说了这么多,我们终于万事具备,可以开始尝试做一些二次开发的工作,看到这里你有没有终于体会到了magento2的一点点复杂?这还只是开始,更多的复杂还在后面,用我们同事的话说,”改代码一分钟,找代码三小时”.如果你对magento2的开发理念没有一些基础了解,你会彻底懵掉的.不过,还好,你看到我的文章了,跟着我来,我会给你讲明白的.下一节我们会尝试修改页面上的一些样式,让你初步体会下magento2的灵活和复杂.
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台用户上传并发布,不构成投资建议请自行甄别,如有侵权请联系删除:liaycn@163.com
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of the site, which is a social media platform and only provides information storage services.