Yii2 Day 4: 模块化开发

困境

作了几年Windows环境下程序开发(大概200多个模块,几百万行代码),转作PHP Web开发后,发现模块级别的代码重用实在是不如意啊,重用基本上都是代码复制粘贴级别的,耦合度都过高,不利于代码打包和重复发布。好比文件上传,包含了前端页面部分的展示代码和服务端处理上传文件的代码,须要处理以下几个问题:前端

  1. input控件的名称,由于服务端须要这个来获取$_FILES中的信息
  2. 文件若是是图像,须要判断是不是真正的图像,是否进行缩放处理,加水印等操做
  3. 文件存储位置
  4. 多文件上传的时候,服务端处理信息的返回,好比某一个文件出现异常
  5. 文件信息的存储,上传到服务器的文件,要在数据库中记录下吧,日期,路径,什么的,好管理。

还有更多别的细节,单从这5个问题来看,已经不可避免地涉及到前端展示和后端数据库了,所以用Yii扩展(Extension)的方式,没法知足实际的要求(有不一样意见的同窗能够留言讨论)。所以须要更加完备的载体去实现这些功能,天然考虑用模块的形式去实现。具体方法以下:数据库

可行方案

  1. 创建一个attach模块,用以处理全部的业务
  2. 前端展示,用widget包装,放在attach模块内部,建一个widgets目录
  3. 处理上传文件,用action实现
  4. 对图像的处理,可能会用到第三方类库,在attach模块里,建一个vendor目录,存放第三方类库
  5. 数据库表初始化代码,用于建立或生成相应的文件上传记录表

目录结构以下图所示:后端

目录结构

如此一来,这个模块就在必定程度上,能够独立发布了,其余Yii用户,只要把这个模块放到modules目录下,在配置文件里加上引用,就OK啦。安全

模块依赖

现实开发中,不会那么一路顺风,总会有更多的需求进来。好比,有attach模块后,从安全方面考虑,须要肯定用户是否已经登录,以及用户的一些操做权限是否能进行文件上传操做,这个时候,势必要依赖于用户模块,关于模块依赖,Yii没有提供官方的解决方案,让你们自由发挥了。个人建议是,用声明式的解决方式,好比在模块文件里,加说明。更增强制的办法是加接口,强制调用的第三方实现。服务器

先后台分开

一般一个应用创建的时候,会有先后台,一般作法是,整一个frontend目录和一个backend目录,区分前台和后台。可是用模块化方式开发后,为了保证模块尽量的自描述,独立性特征,须要在模块内部区分先后台,建议的方式是分别创建两个,即前台FController和后台基础AController,其余模块内部的控制器,继承对应的控制器,这样就在模块内部,实现了先后台分离。简单小结下先后台分离所涉及的内容frontend

  1. 用户分离,前台控制器验证的是前台用户,后台控制器验证的是后台用户信息
  2. 布局分离,先后台布局应该差异很大,因此在FController和AController两个基类里,须要分别设置不一样的layout,实现布局分离
  3. ...(还没想到更多,欢迎补充)

跨模块调用

跨模块调用不可避免会发生,好在Yii1.x 有个getModule方法,能够把模块初始化,并解决文件导入问题。美中不足的是,IDE的代码提示没法提示动态的模块调用,不过能够用PHPDoc方式解决,参加另外一篇博文。Yii2,又增长了一个getInstance()方法,此次完美解决了代码自动提示问题,赞一个。模块化

目录结构

这样一来,目录结构会变成这样:布局

目录结构

各个功能都各自尽可能在模块内部解决问题。继承

相关文章
相关标签/搜索