開發環境
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