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 相关文章推荐
php cookie 作用范围?不要在当前页面使用你的cookie
Mar 24 PHP
谈谈新手如何学习PHP 默默经典版本
Aug 04 PHP
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
Mar 09 PHP
php中计算程序运行时间的类代码
Nov 03 PHP
set_include_path和get_include_path使用及注意事项
Feb 02 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
Jun 20 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
php+mysql结合Ajax实现点赞功能完整实例
Jan 30 PHP
php将金额数字转化为中文大写
Jul 09 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
Syphon 使用方法
2021/03/03 冲泡冲煮
fgetcvs在linux的问题
2012/01/15 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
php遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
php报错502badgateway解决方法
2019/10/11 PHP
js 获取Listbox选择的值的代码
2010/04/15 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
JavaScript多线程详解
2015/08/12 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
python实现一次创建多级目录的方法
2015/05/15 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
Python调用C语言程序方法解析
2020/07/07 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
JAVA代码查错题
2014/10/10 面试题
亲子读书活动方案
2014/02/22 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
golang 实现并发求和
2021/05/08 Golang
Python Pandas常用函数方法总结
2021/06/15 Python
MySQL系列之四 SQL语法
2021/07/02 MySQL