初次认识phalcon是在刚学php的时候,最近终于有机会⽤上了.故此说说使⽤上的⼀些感受
个⼈是很喜欢phalcon这套框架的⽅式,使⽤依赖注⼊,让代码组织很灵活,耦合也很低.但是,也许是框架东西太多了,遇到⼏个坑. github上⼀年以上的issue也还没解决.不过有⼀定开发经验的话,还是可以⾃⼰修复的.被这⼏个坑浪费了不少时间....第⼀个是view.
phalcon的view,可以分成两⼤部分,⼀是全局的layout,⼆是controller/action的部分, 让使⽤时更加⽅便,设置好layout后,只关注controller部分的view即可. 但是关于view的路径设置问题,要关注这⼏个参数
MainView(主layout⽂件路径+⽂件名,但不包括扩展名,扩展名是在注⼊视图引擎时的key键值),LayoutsDir(layouts的⽬录路径),
Layout(主layout⽂件名,可根据需求,动态使⽤layouts⽬录下的某个⽂件充当mainView),
PartialsDir(使⽤partial函数时,查找模板⽂件,如partial('main/header') 则查找路径是\"/你的partialsDir/main/header.volt\" . ),ViewsDir(设置controller/action对应的模板⽂件所在的⽬录.和partialDir类似,⾃动查找⽬录下的模板⽂件)BasePath(视图的⽬录的基础⽬录,phalcon和根据所有设置的dir来组合路径,查找模板⽂件,坑就是这了)我刚开始⽤这个view的时候,使⽤的是绝对路径,因为绝对路径配置和管理⽐较⽅便.然后我就被坑了.浪费了⼀个下午的时间调试.
根据官⽅⽂档给出的例⼦反复测试,发现这个view组件只能使⽤相对路径设置路径,BasePath不⽤设置.⼀⽓之下就去翻phalcon的源码了.开发语⾔是Zephir,phalcon团队⾃⼰开发的语⾔.语⾔语法⽐较简单,容易懂.然后看到了这句.
..]
看起来像是没有判断是相对路径还是绝对路径,直接组合起来了⽽已的,猜测是这⾥引发了问题.并且是直接按顺序解析action , layout , main layout这些模板⽂件.于是想验证⼀下.所以我写了⼏个调试⽂件,打算调试⼀下.
翻查phalcon源码过程省略1000字...找到必然会调⽤,并有路径处理的⼏个主要⽅法,继承View相关的⼏个class
这⾥也强调下,很多⼈喜欢⽤echo,⼀般情况是没问题,但最好还是⽤⽂件记录吧,因为echo局限性其实挺⼤的,
你不知道echo buff什么时候打开,什么时候关闭..使⽤⽂件来记录log最保险了.
我测试的代码,使⽤多模块的⽅式.
BaseView⽂件,继承phalcon的view,并且打开这个⽅法的报错信息
BaseVolt⽂件,继承模板引擎volt
view注⼊代码,和⽬录结构如图
log记录如下
页⾯输出如下:
跟想像的⼀样,使⽤绝对路径时,⽆论如何,phalcon都是直接拼接以上设置的路径,
当开发者想动态使⽤controller/action的view,但layouts主⽬录⼜在上层⽬录时,就会出问题.
phalcon找的main layout路径是Phalcon\\Mvc\\View\\Exception: View '/Users/Hin/work/phalcon_mode/app/modules/admin/views/layouts/main' was not found in the views directory⽽我要的是/Users/Hin/work/phalcon_mode/app/views/layouts/main然后找不到路径,main layout模板⽂件就不起作⽤了..........
所以,真的就只是直接组合三个路径⽽已..所以,在设置路径的时候,就看⾃⼰的取舍了.
phalcon view源码⾥三个变量中,basePath,viewDir(关键就是作者对viewDir这个变量理解有误,导致的bug) 看成是基础的路径. viewPath是依次执⾏_enginrender时的actionview,layout view ,main view的路径.
理解了这个就可以⾃⼰慢慢设置好了路径了.....
解决办法有三个.
⼀ 是⾃⼰写个View继承phalcon的View,处理路径. 思路是除了action的定位外,其他定位将viewDir变为空.
⼆ 是修改phalcon源码,再⾃⼰编译⼀遍(在_enginRender外部处理好路径定位,去除_enginRender和路径定位的耦合)
三 是,不管了,直接使⽤相对路径(不设置basepath,viewsDir因为要动态定位action view,使⽤绝对路径, layoutsDir partialsDir使⽤相对路径)github上是有⼈发过这个bug的issue,可是作者没理会......
------------------------------华丽分割线------------------------------------第⼆是model
还有个坑,是关于phalcon的model.⼀样是发了issue,作者没管.
根据⽂档model是提供了setter 链接描述 ⽅法的,可实际上,setter却不起作⽤...
然后像view⼀样,⾃⼰修复好...
个⼈认为setter getter是⾮常好⽤的功能,但有些⼈却觉得没⽤,见仁见智啦.
我们的开发模式是model和controller 由不同的⼈开发,有了setter getter,数据调⽤者只管拿数据就可以了,model数据出问题,在model中修改即可,controller不需要改动.⼯作模式上耦合可以降低很多.
不过⽤这个框架的开发的项⽬夭折了,再深⼊点的坑也遇不到了.没有意外的话,短期内也不会⽤了.最近⼼情⽐较糟糕.写得⽐较随便.当个记录好了.......
最后直接附上 源码,多模块模式开发⽤这样的⽬录结构也是不错的,希望能帮到别⼈
因篇幅问题不能全部显示,请点此查看更多更全内容