建议PHP组以后统一运用此框架开发应用-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 //插件目录
复制代码

命名规范

同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/&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, 访问规则

@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

 

参考资料 

yaf.laruence.com/manual/

项目地址

https://github.com/laruence/php-yaf

One thought on “建议PHP组以后统一运用此框架开发应用-YAF”

发表评论