12月13, 2013

yaf项目实践总结

最近写一个项目用到鸟哥的yaf,以前是了解的心态,现在是在实践中越来越熟悉。yaf最大的优点就是性能上优势,不足嘛,就是在库类的丰富性,还有一些功能特性 没法跟成熟的php框架比。这个不足可以理解,毕竟yaf算是定位在性能上取胜的扩展型框架。一些没有的特性可以基于yaf二次开发。 下面是我使用yaf的一些技巧。记录下来给同样使用yaf的读者一点思路。

使用yaf有一个问题就是,如果module不在application/controller,而是在modules下,浏览器需要输入完整的index/index/index才能正确访问,而不能像index/index自动识别成完整的。改不了c代码,可以在bootstrap类里教它怎么智能识别。 下面代码是在bootstrap类方法。

//fix router error
    $uri = $dispatcher->getRequest()->getRequestUri();
    $uriparamcount = count(explode('/', trim($uri, '/')));
    if ($uriparamcount < 3) {
        @list($module, $cont) = explode('/', trim($uri, '/'));
        if (is_null($cont)) {
            $cont = 'index';
        }
        if (in_array(ucfirst($module), Yaf_Application::app()->getModules())) {
            $request = new Yaf_Request_Simple('', ucfirst($module), ucfirst($cont), "index");
            $dispatcher = $dispatcher->setRequest($request);
            $dispatcher->getRequest()->setDispatched();
        }
    }

对于seo的考虑,action部分有时候不是固定方法,而是动态的值,比如/member/1231,shop/12312。对于这种写法,还好控制器提供了约定init的类方法,在init方法内对传入的request对象更改dispatch后的值即可。

动态action 的处理:

public function init(){
    $shopuid = $this->getRequest()->action;
     if(is_numeric($shopuid)){
         $this->getRequest()->setActionName('show');
         $this->getRequest()->setParam('shopuid', $shopuid);
      }
}

实现REST结构的框架,首先要注意框架对于view是自动渲染的,即隐形调用。可以在controller的init方法

Yaf_Dispatcher::getInstance()->disableView();

或者在bootstrap类 全局关闭。

$dispatcher->autoRender(FALSE);

yaf的控制类功能是抽象的,可以基于yaf的controller类扩展自己的功能。子控制类继承yaf的控制类,命名只要符合“xxxController”即可,而且文件放在application/controller下。