对magento2架构的一些评价

用magento2开发过三个项目,大概用了一年多了,magento2是我用过的PHP开源中架构最优秀的。我对于优秀架构的定义是有极强的灵活性,magento2充分发挥了symfony依赖注入的优点,让组件代码组织变得更松散,却又加强了灵活性。也许很多人对于灵活性没有什么概念,我举一个我在joomla项目上的例子:

joomla项目某个客户需求中要求改动文章组件的结构,joomla的文章并没有EAV,不能增加字段,而且文章model层用的是传统的OOP,而我需要扩展的数据成员是保护类型,就算我用继承类也会因为不能修改保护类型而无法直接进行数据扩展。这可能只是个小小的修改,因为只需要我修改joomla的原始组件内的程序一两行代码,但为了能保证以后能顺利升级,我不能修改Joomla所有原始文件。无奈之下,我可能为了一个小修改而把文章model层的整个copy一份,再对它进行改造。这明显是十分冗余的方法,让有代码洁癖的我也十分难受,而且随着需求越来越多,代码就开始变得难以维护。迭代的成本变得越来越高,最后改也改不动了,只能用其它CMS重构。

另外也说说opencart,这是个十分容易上手的PHP开源电商,国内也使用得十分多,还有仿京东的模板,名叫小京东。opencart的架构就十分简单,简单得不像是有架构,很多扩展模块,是需要对opencart原始文件替换来实现的。要是一直不升级还好,真要升级了就很麻烦,可能要整套代码替换掉,再一个一个把模块补上。不升级行吗?如果只是普通的信息站,那就没有没有被入侵的价值了,有漏洞也不会有多大损失。但电商是跟钱有关的,每个漏洞都很有可能被利用,黑客也许会不动声色,创建了已经付过款的订单让你发货,又或者把刚刚购买成功的订单改成自己的地址。而真正付钱购买的用户收不到货肯定会投诉的。其实opencart比起国内的开源电商要安全多了,但还是需要时常升级才能保证最低限度的安全性。无损扩展当然也是所有opencart使用者的需求,所以现在opencart有vqmod,这东西能不改动原始文件进行扩展,只是扩展的操作并不如那些已支持原始代码扩展功能的系统方便。而且如果多个模块对同一个代码文件进行大量修改时,也不能保障互相之间没有冲突,与magento2还是差远了。

而在magento2下很少会出现这种架构硬伤,依赖注入可以轻易通过修改几行XML实现整个类的改造。在magento的Q群里,偶有高手来吹自己做过的变态价格优惠策略。我认为甚至是双11淘宝那些复杂烦人的优惠价叠加在magento上也是可以实现出来的。所以我的结论是:对于一个需要长期迭代开发的项目,架构的不足是会成为硬伤的。也许大家都知道magento从1到2都很慢,2更是慢得离谱。但效率不是硬伤,你可以加多十几台服务器用于redis和varnish与mysql的负载均衡,但是不良架构所造成的残局根本找不到人来收拾。

magento2内已经有对于varnish和redis的支持,在nginx下部署跟在apache下一样轻松,所以magento2要配上redis nginx varnish的成本是很低的,根本就是标配,所以别老是说不用varnish就有多慢了,官方一直觉得那些是必须有的。

magento2有大量的XML配置,就算能缓存起来,但也是需要不少时间进行解析。不过没有XML配置就好了吗?XML是语言无关的描述格式,而magento都比较偏向于用XML描述一切,这其实给交互性留下空间。XML所表达的意义很复杂,不适合给人看,但给代码看行吗?我除了用php做项目开发之外,还会用C#, powershell和python开发一些小工具,其中就有通过XML分析整个magento结构,只需要写XML,会自动生成代码等工具。这样用起来其实比任何PHP开源电商都要方便,只要这套工具够完善,甚至有希望能让完全不懂magento的人轻松编码。而其它电商系统估计不容易实现,因为它们没有大量使用语言无关的格式来当作配置。只不过这些目前只是个愿望,工具我也只能抽时间来做,不过magento在线上已经有组件生成的工具了(Magento 2 Module Creator)。

但magento2也是有不少缺点的,2.0和2.1版本都是有不少BUG,到2.2就好很多了,BUG慢慢已经不是大问题,只是它的前端架构实在让人很头痛。在magento2旦生之时正是前端的混乱期,框架层出不穷,mg2使用的是当时比较流行的knockoutjs,现在都过时了,官方却煞费苦心用knockoutjs设计出UI组件集。如果没有后来的react,AngularJS, Vue,knockoutjs UI组件集真的很好,但现在跟这些主流比起来就显得十分臃肿。官方写的文档又不多(可能为了卖书,比起卖商业版,我觉得卖证书和教材更赚钱),knockoutjs不容易定位错误,很难DEBUG,学习门槛很高。后台又有一大堆用XML描述出来的UI,完全不知所云。

magento2适不适合国内,这个是视情况而定,学习门槛高是使用magento2的最大硬伤。但是magento2的架构无疑是值得抽时间去了解学习的。

有的人用mg1和mg2比较,也许一些人对它们之间的区别感兴趣,但其实没什么好比,因为是两个不同的系统,没有什么共通点可言。mg1的开发知识几乎完全不能用在mg2上。而对于大多数PHP的项目,magento2给我们带来了很新鲜的体验,例如它大量使用依赖注入与knockoutjs,不止是PHP后端有大型架构,连JS前端都有大型架构,并且把PHP用得像JAVA。

相关推荐