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

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM