phalcon框架使用指南


Posted in PHP onFebruary 23, 2016

初次认识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团队自己开发的语言.

语言语法比较简单,容易懂.然后看到了这句.

phalcon框架使用指南

..]

phalcon框架使用指南

看起来像是没有判断是相对路径还是绝对路径,直接组合起来了而已的,猜测是这里引发了问题.

并且是直接按顺序解析action , layout , main layout这些模板文件.

于是想验证一下.所以我写了几个调试文件,打算调试一下.

翻查phalcon源码过程省略1000字...找到必然会调用,并有路径处理的几个主要方法,继承View相关的几个class

这里也强调下,很多人喜欢用echo,一般情况是没问题,
但最好还是用文件记录吧,因为echo局限性其实挺大的,
你不知道echo buff什么时候打开,什么时候关闭..使用文件来记录log最保险了.

我测试的代码,使用多模块的方式.

BaseView文件,继承phalcon的view,并且打开这个方法的报错信息

phalcon框架使用指南

BaseVolt文件,继承模板引擎volt

phalcon框架使用指南

view注入代码,和目录结构如图
phalcon框架使用指南

phalcon框架使用指南

log记录如下
phalcon框架使用指南

页面输出如下:

phalcon框架使用指南

跟想像的一样,使用绝对路径时,无论如何,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时的action view,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一样,自己修复好...

phalcon框架使用指南

个人认为setter getter是非常好用的功能,但有些人却觉得没用,见仁见智啦.
我们的开发模式是model和controller 由不同的人开发,有了setter getter,数据调用者只管拿数据就可以了,
model数据出问题,在model中修改即可,controller不需要改动.工作模式上耦合可以降低很多.

不过用这个框架的开发的项目夭折了,再深入点的坑也遇不到了.没有意外的话,短期内也不会用了.
最近心情比较糟糕.写得比较随便.当个记录好了.......

最后直接附上 github 源码,多模块模式开发用这样的目录结构也是不错的,希望能帮到别人

PHP 相关文章推荐
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
用PHP程序实现支持页面后退的两种方法
Jun 30 PHP
php中截取中文字符串的代码小结
Jul 17 PHP
php CI框架插入一条或多条sql记录示例
Jul 29 PHP
PHP之autoload运行机制实例分析
Aug 28 PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
Jul 15 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
PHP获取当前系统时间的方法小结
Oct 03 PHP
解决在Laravel 中处理OPTIONS请求的问题
Oct 11 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
Apr 26 PHP
PHP计算日期相差天数实例分析
Feb 23 #PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
Feb 23 #PHP
PHP编写RESTful接口
Feb 23 #PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 #PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
Feb 23 #PHP
php读取txt文件并将数据插入到数据库
Feb 23 #PHP
PHP调试的强悍利器之PHPDBG
Feb 22 #PHP
You might like
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
2016/08/29 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
php修改数组键名的方法示例
2017/04/15 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
js字符编码函数区别分析
2011/12/28 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
js创建数组的简单方法
2016/07/27 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
vue中jsonp插件的使用方法示例
2020/09/10 Javascript
[04:52]2015国际邀请赛LGD战队晋级之路
2015/08/14 DOTA
Python创建日历实例
2014/08/21 Python
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
python字符串循环左移
2019/03/08 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
美国最大的团购网站:Groupon
2016/07/23 全球购物
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
成人毕业生自我鉴定
2013/10/18 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
学生喝酒检讨书500字
2014/11/02 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python