PHP 架構 Yaf 學習筆記----預設行為
Yaf是一個C語言編寫的PHP架構,以php擴充的形式. 是 laruence(鳥哥)? 的作品
laruence 是PHP開發群組成員, PECL開發人員. Yaf, Taint等Pecl擴充作者.
Yaf 相關文章 http://www.laruence.com/tag/yaf?? 線上手冊
線上手冊系統完整的闡述了Yaf的一切,這裡作為學習導讀,列出Yaf的預設行為(契約)
0.Yaf 設定檔(php.ini風格)
其實分兩部分,一個是php.ini中的配置 "yaf." 開頭,這部分通常是不用調整的。
另一部分是Yaf_Application初始化時刻的配置 "application." 開頭
?
配置可以引入php常量定義
1.Yaf 的必須配置,其實就是個目錄設定
yaf.directory=APP_PATHapplication.directory=APP_PATH
也就是 appliction 指令碼目錄,至少要定義一個,application.directory優先
2.Yaf 有一套完整的目錄組織,檔案命名規則
所有Yaf應用都應該遵循下面的目錄組織圖
- index.php //入口檔案- .htaccess //重寫規則 + conf |- application.ini //設定檔 application/ + controllers - Index.php //預設控制器 + views |+ index //控制器 - index.phtml //預設視圖 + modules //其他模組 - library - models //model目錄 - plugins //外掛程式目錄
?
Yaf支援大小寫敏感和不敏感兩種方式,但是我沒有找到大小寫敏感的用法(linux環境)
類命名和搜尋規則
類名稱???????????? 對應目錄
ClassModel????? models
ClassPlugin????? plugins
ClassController controllers
其他??????????????? library
3.Yaf 是通過以包含分隔字元"_"的類名稱配合目錄組織,和完整的類命名規則完成類載入管理
比如以前你有一個Bar類檔案Bar.php,如果用到Yaf裡,並自動載入,那麼就要這樣組織
把Bar.php放到library目錄下的一個子目錄裡面,比如 myclass
並且要更改Bar.php裡面的類名(一般都是Bar的)為MyClass_Bar
也就是說類名必須包含目錄名 具體解釋
4.錯誤處理
Yaf裡面錯誤處理可以通過一個控制器完成,聲明在 APP_PATH/controllers/Error.php 裡
class ErrorController extends Yaf_Controller_Abstract {...}
當然錯誤控制器是否生效受配置影響
application.dispatcher.throwException=1application.dispatcher.catchException=1
具體看 官方提供的例子
5.視圖view
render視圖需要指定視圖模板檔案,可以用相對(application/views)路徑或者絕對路徑
6.路由
Yaf提供了多種層級的路徑支援,正則路由也有支援,你可以用設定檔寫路由,或者在Bootstrap.php裡面用php指令碼寫路由
個人認為Yaf最迷人的地方是:
PHP Framework in PHP extension,如果沒有資料庫訪問的瓶頸造成的木桶效應,Yaf這種形式是最優的
使用Yaf後在某種層級的應用中記憶體佔用應該降低很多
?
7.BUG?發現如下問題,不知道是否是bug
Yaf在匹配設定檔的節(section)的時候,不是對名稱完全符合,比如配置裡面有
[product]...
new Yaf_Application("conf/app.ini",'p')//照樣可以被匹配到
?
8.MVC
Yaf和大多數架構一樣提供了一個預設的MVC行為,對於M(setDefaultModule)我沒有找到更改生效的方法。
C和V是一一對應的,當然可以名稱不同,可以通過Yaf_Dispatcher的setView方法進行設定。
?
9.單例模式類,Yaf中
Yaf_Application
Yaf_Loader
Yaf_Dispatcher
Yaf_Registry
Yaf_Session
類執行個體是單例,其他不是
需要注意如果在Yaf_Controller_Abstract繼承類action中使用了forward,那將會產生新的執行個體對象。
?
10.非嵌套Dispatcher(2.x版本以下)
Yaf對請求的處理是非嵌套的,這意味著所有對Controller轉移都是非嵌套的,如果一個Controller沒有執行完,發生了轉移,那有可能發生不可知的結果甚至錯誤,Yaf提供的forward是等待當前Controller執行完畢才處理的,因此如果完全按照MVC的方式對請求進行處理,要達到嵌套處理的效果,需要自己實現代碼.流程對應說明
mainloopstart dispatchLoopStartup preDispatch//其實是個迴圈受forward控制 這之間request不能發送改變,可以forward但是會被延期執行 postDispatch forward的request延期執行,迴圈到preDispatch dispatchLoopShutdown 可以dispatch一個新的request,會開始新的dispatchLoopStartupmainloopend
?
?