• 原文作者:我才是二亮

  • 原文链接:http://blog.2liang.me/2016/09/03/first-use-yaf

  • 转载必须在正文中标注并保留原文链接、作者等信息。
     
     
    yaf官方文档地址:http://www.laruence.com/manual/
     
     

    0x00 开题

     
     
    一个新的小项目,目前是我一个人在搞,在选型的时候,结合leader和其他同事的意见,最终选择了使用鸟哥的Yaf框架,毕竟该框架是使用PHP扩展实现的,效率相比其他纯PHP实现的框架,效率提高了很多。但是因为之前没有使用过Yaf框架,所以在第一次使用过程中,也遭遇了一些问题,今天有空,就将这些问题记录下来,以便后用。
     
     

    0x01 Yaf框架的多模块

     
     
    该项目分为前台,管理,接口等模块,如果将所有模块放在Yaf的默认模块中,项目耦合度将会变高,后期维护成本也会上升,所以最终选择使用Yaf的多模块来对项目进行分模块部署。
     
     
    在Yaf框架中,进行多模块部署,有一个和其他框架不同的地方,就是最外层目录中的模块为该项目的默认模块即Index模块,而其他模块需放在modules目录下,他并不能将这些模块以一种平行的方式部署在一起。
     
     
    而在Yaf中,将其他模块部署在modules目录下,而Yaf框架仅仅支持MVC架构中的ControllersViews的多模块,而Models并不支持在模块下新建models文件夹来进行处理。所有模块必须共用项目Application目录下的models文件夹。
     
     

  • 1)多模块目录结构如下:
    当我第一次使用Yaf_第1张图片

 
 
 

  • 2)配置多模块

当设置好项目目录之后,需要修改配置文件中的application.modules,如下:

application.modules = "Index,Api,Admin"

0x02 models的多模块

 
 
因为上一节所说的,在Yaf框架中不支持在子模块目录下新建models,而是必须公用默认模块的models目录,而如果我们将所有的models都直接在该目录下开发,那项目的界限就变得不那么明朗,无论是开发过程中,还是后期维护中,都带来了不便,因此需要使用另外一种方式进行分模块。
 
 
models目录下,我们可以创建多个文件夹,使用命名空间,而在多个文件夹的方式下使用models的时候,有一个坑。
 
 

关于命名空间

 
 
在每个文件夹下使用命名空间,必须仅以这个文件夹为命名空间,不能使用models\文件夹名称作为命名空间 ,因为Yaf框架对于model会默认去models文件夹中查找,一旦添加了models,便找不到该model文件了。
 
 
关于model文件命名以及类名命名的坑
 
 
在Yaf中使用单模块时,model文件可以与类名一致。而在使用多文件夹方式中,类名必须是文件名后加上Model才可以。这个问题当时搞了我好久,都懵逼了。
 
 

0x03 ORM的使用

 
 
Yaf框架的一个特点就是轻量,很多东西比如ORM都没有官方提供,而是交由开发者自己选择自己喜欢的ORM或者自己开发一套ORM在框架中使用,而在此次项目中,我使用了Laravel框架的Eloquent ORM,目前Laravel已经将自己的Eloquent ORM进行了组件化,只需要使用composer就可以安装,安装完成后,在Yaf的bootstrap文件中,引入composer的autoload文件即可。
 
 

0x04 使用过程中的一些小坑

 
 

controller继承的问题

 
一般的PHP框架,在使用多模块的过程中,每个模块都可以独立为一个项目,可以有自己的基类等等,但是在Yaf中所有的继承都必须放在默认模块的Controllers下,因为Yaf只会在默认模块中寻找其他文件所继承的类,这也是一个比较尴尬的。