Yaf应用建议

开发环境

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 //插件目录
复制代码

命名规范

补充 :
变量命名,全小写字母,单词用下划线分割,非驼峰
类方法命名,采用驼峰命名
类命名,应注意类与父目录之间的关系, 通常“目录名_类名”,  目录首字母和类首字母大写, 例 “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/&param1=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&param1=value1……
rewrite 路由(支持参数映射),支持REST, 访问规则
regex 路由(支持参数映射),支持REST, 访问规则
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

参考资料 
项目地址
来源:http://www.youeer.com/archives/101

评论

此博客中的热门博文

Tailscale 开源版中文部署指南(支持无限设备数、自定义多网段 、自建中继等高级特性)

iOS任意版本号APP下载(含itunes 12.6.5.3 最后带AppStore版本)

关于 N1 旁路由的设置

Mifare Classic card(M1卡)破解过程记录(准备+理论+获取扇区密钥+数据分析)

Blogger搭建国内可正常访问博客(超详细教程)

一些免费的云资源

打造一个可国内访问的Blogger(Blogspot)方法

百度站长平台中接入Blogger博客

Mifare Classic card(M1)卡破解过程

重新学习并解锁emby4.6.7,4.7.2版本