开发环境
yaf开发环境建议 lamp,目前yaf的最新版本为2.1.18(建议使用),php version 5.3+
apache 必须开启rewrite模块
yaf框架是基于C扩展写的,调试起来相对麻烦。建议你的开发环境中,php.ini应如下配置:
display_errors = on log_errors = on html_errors = on error_reporting= E_ERROR | E_WARNING | E_PARSE | E_NOTICE
目录结构
+ public //网站根目录 - index.php //入口文件 - .htaccess //重写规则 + conf |- application.ini //配置文件 application/ + controllers - Index.php //默认控制器 + views |+ index //控制器 - index.phtml //默认视图 + modules //其他模块 - library //组件目录 - models //model目录 - plugins //插件目录
命名规范
同Pear命名规范,@see http://www.wzjs163.com/tangshan/knowledge/php/41.html#1
补充 :
变量命名,全小写字母,单词用下划线分割,非驼峰
类方法命名,采用驼峰命名
类命名,应注意类与父目录之间的关系, 通常“目录名_类名”, 目录首字母和类首字母大写, 例 "Base_Func", 类文件存储位置为Base目录下的Func.php
部件(library)加载
默认规则
yaf框架的默认设置是,只要是符合命名规则类,只要放在APPLICATION_PATH/library下的类目录都会被加载,因为此时的APPLICATION_PATH/library目录
为全局目录. 所以我们不需要去注册本地类。
全局类
我们开发的时候,通常会遇到这样的情形。多个应用同时公用一些类,我们常常把这些类称为全局类。
为了使这些类得到统一管理,避免这些类的反复修改,我们通常会把这些类的全局空间里。
我们需在php.ini文件夹下做如下配置:
yaf.library=/var/www/yaf_global
这样,我们的全局空间默认的路径就在"/var/www/yaf_global"下了,所有存放在全局空间的类,符合yaf命名的规则类都将被加载
本地类
本地类是指应用的自身类库.
我们要修改本地类的存放路径,只需在应用的配置文件增加:
application.library = 本地类空间的路径(绝对路径)
Yaf_loader::import
既然有了autoloader,那么什么时候我们需要使用Yaf_loader::import
第一种,你的类属于第三方类,也就是不属于YAF命名规范的
第二种,你的文件不是一个类,它可能只是一个存放很多方法的文件
第三种,你的文件没有存放在自动加载的空间里,你依然想使用
YAF单例模式类
Yaf_Application, Yaf_Loader, Yaf_Dispatcher, Yaf_Registry, Yaf_Session,这些类都是单例模式类。反之,其他类不是
你可以通过它们的getInstance() 来获取它们的单例,也可以通过Yaf_dispatcher::getXXX方法来获取实例
YAF 链式操作
Yaf的很多类提供的api都是直接返回自身对象的,这样我们可以很方便的进行链式操作。
Yaf_Session::getInstance()->set('name', "alex")->set('sex',"男");
YAF 默认url访问规则
Yaf默认开启的路由是static路由模式.
static路由模式的访问规则为,http://domain-name/module-name/controller-name/action-name/param1/value1.....
如果你想切换路由模式,那么需在应用的配置文件增加:
application.dispatcher.defaultRouter = 默认的路由形式
Yaf默认的模块为Index, 默认的Controller为Index,默认的Action为Idex,这些你也可以通过框架进行配置更改
application.dispatcher.defaultController = 默认的控制器 application.dispatcher.defaultModule = 默认的模块 application.dispatcher.defaultAction = 默认的动作
YAF 路由
Yaf支持5种默认路由模式. 注:以下规则示例中省略了入口文件
static 路由(不支持参数映射), 访问规则
http://domain-name/module-name/controller-name/action-name/param1/value1.......
supervar 路由(不支持参数映射),访问规则
http://domain-name/?r=/module-name/controller-name/action-name/¶m1=value1......
simple 路由(不支持参数映射),访问规则
http://domain-name/?m=module-name&c=controller-name&a=action-name http://domain-name/?m=module-name&c=controller-name&a=action-name¶m1=value1......
rewrite 路由(支持参数映射),支持REST, 访问规则
@see http://yaf.laruence.com/manual/yaf.routes.static.html#yaf.routes.rewrite
regex 路由(支持参数映射),支持REST, 访问规则
@see http://yaf.laruence.com/manual/yaf.routes.static.html#yaf.routes.regex
yaf 支持多种路由同时共存,是优点也是缺点. 假设情景路由只支持rewrite路由模式,而不支持regex路由,但这两种路由都存在,我们如何
用最有效的方法的去处理.代码如下
class UserPlugin extends Yaf_Plugin_Abstract { public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { $router = Yaf_Dispatcher::getInstance()->getRouter()->getCurrentRoute(); if ($router == 'regex') { throw new Exception("not found page"); } } }
另,配置路由的时候,请注意路由配置的顺序
Yaf 插件
yaf 插件主要用来增强Yaf框架功能,网上有人利用yaf的6个hook实现了YAF框架调试日志功能, 也有人利用插件实现了yaf的layout,
还有象上例实现路由的再次重定向,譬如我们可以通过IP段,UA,将请求重定向不同的模块,Controller,来处理
如何来写一个插件呢,我们只需写一个类去实现Yaf_Plugin_Abstract, 并将插件注册一下.
class SamplePlugin extends Yaf_Plugin_Abstract { public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { //在路由之前触发 } public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { //路由结束之后触发 } public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { //分发循环开始之前触发 } public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { //分发之前触发 } public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { //分发结束之后触发 } public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { //分发循环结束之后触发 } }
注册需在bootstrap进行
public function _initPlugin(Yaf_Dispatcher $dispatcher) { //注册一个插件 $sample_plugin = new SamplePlugin(); $dispatcher->registerPlugin($sample_dplugin); }
Yaf 模块
模块的使用再日常开发的情景非常多.比如CMS 前台后后台,可以定义为Index和Admin,这样它们可以共用配置文件和library.而且url也更加友好。
开发过程中也能分模块开发. 我们可以把一个搜索栏目,拆为新闻模块,供应模块,求购模块,产品模块,公司模块。或者分得更细些
模块在Yaf中的配置
application.modules = admin,index
参考资料
项目地址
https://github.com/laruence/php-yaf