phalcon使用經驗雜談

初次認識phalcon是在剛學php的時候,最近終於有機會用上了.故此說說使用上的一些感覺 php

我的是很喜歡phalcon這套框架的方式,使用依賴注入,讓代碼組織很靈活,耦合也很低.可是,也許是框架東西太多了,遇到幾個坑. github上一年以上的issue也還沒解決.不過有必定開發經驗的話,仍是能夠本身修復的.被這幾個坑浪費了很多時間....html

第一個是view.

phalcon的view,能夠分紅兩大部分,一是全局的layout,二是controller/action的部分,
   讓使用時更加方便,設置好layout後,只關注controller部分的view便可.
   可是關於view的路徑設置問題,要關注這幾個參數
  1. MainView(主layout文件路徑+文件名,但不包括擴展名,擴展名是在注入視圖引擎時的key鍵值),git

  2. LayoutsDir(layouts的目錄路徑),github

  3. Layout(主layout文件名,可根據需求,動態使用layouts目錄下的某個文件充當mainView),app

  4. PartialsDir(使用partial函數時,查找模板文件,如partial('main/header') 則查找路徑是"/你的partialsDir/main/header.volt" . ),框架

  5. ViewsDir(設置controller/action對應的模板文件所在的目錄.和partialDir相似,自動查找目錄下的模板文件)函數

  6. BasePath(視圖的目錄的基礎目錄,phalcon和根據全部設置的dir來組合路徑,查找模板文件,坑就是這了)測試

    我剛開始用這個view的時候,使用的是絕對路徑,由於絕對路徑配置和管理比較方便.
    而後我就被坑了.浪費了一個下午的時間調試.
    根據官方文檔給出的例子反覆測試,發現這個view組件只能使用相對路徑設置路徑,BasePath不用設置.spa

    一氣之下就去翻phalcon的源碼了.開發語言是Zephir,phalcon團隊本身開發的語言.
    語言語法比較簡單,容易懂.而後看到了這句.
    clipboard.png調試

..]

clipboard.png

看起來像是沒有判斷是相對路徑仍是絕對路徑,直接組合起來了而已的,猜想是這裏引起了問題.
而且是直接按順序解析action , layout , main layout這些模板文件.
因而想驗證一下.因此我寫了幾個調試文件,打算調試一下.
翻查phalcon源碼過程省略1000字...找到必然會調用,並有路徑處理的幾個主要方法,繼承View相關的幾個class

這裏也強調下,不少人喜歡用echo,通常狀況是沒問題,
但最好仍是用文件記錄吧,由於echo侷限性其實挺大的,
你不知道echo buff何時打開,何時關閉..使用文件來記錄log最保險了.

我測試的代碼,使用多模塊的方式.

BaseView文件,繼承phalcon的view,而且打開這個方法的報錯信息

clipboard.png

BaseVolt文件,繼承模板引擎volt

clipboard.png

view注入代碼,和目錄結構如圖
clipboard.png

clipboard.png

log記錄以下
clipboard.png

頁面輸出以下:

clipboard.png

跟想像的同樣,使用絕對路徑時,不管如何,phalcon都是直接拼接以上設置的路徑,
當開發者想動態使用controller/action的view,但layouts主目錄又在上層目錄時,就會出問題.
phalcon找的main layout路徑是Phalcon\Mvc\View\Exception: View '/Users/Hin/work/phalcon_mode/app/modules/admin/views/layouts/main' was not found in the views directory
而我要的是/Users/Hin/work/phalcon_mode/app/views/layouts/main
而後找不到路徑,main layout模板文件就不起做用了..........

因此,真的就只是直接組合三個路徑而已..因此,在設置路徑的時候,就看本身的取捨了.

phalcon view源碼裏三個變量中,basePath,viewDir(關鍵就是做者對viewDir這個變量理解有誤,致使的bug) 當作是基礎的路徑. viewPath是依次執行_enginrender時的action view,layout view ,main view的路徑.
理解了這個就能夠本身慢慢設置好了路徑了.....

解決辦法有三個.

一 是本身寫個View繼承phalcon的View,處理路徑. 思路是除了action的定位外,其餘定位將viewDir變爲空.
二 是修改phalcon源碼,再本身編譯一遍(在_enginRender外部處理好路徑定位,去除_enginRender和路徑定位的耦合)
三 是,無論了,直接使用相對路徑(不設置basepath,viewsDir由於要動態定位action view,使用絕對路徑, layoutsDir partialsDir使用相對路徑)

github上是有人發過這個bug的issue,但是做者沒理會......

------------------------------華麗分割線------------------------------------

第二是model

還有個坑,是關於phalcon的model.同樣是發了issue,做者沒管.
根據文檔model是提供了setter 連接描述 方法的,可實際上,setter卻不起做用...

而後像view同樣,本身修復好...

clipboard.png

我的認爲setter getter是很是好用的功能,但有些人卻以爲沒用,見仁見智啦.
咱們的開發模式是model和controller 由不一樣的人開發,有了setter getter,數據調用者只管拿數據就能夠了,
model數據出問題,在model中修改便可,controller不須要改動.工做模式上耦合能夠下降不少.

不過用這個框架的開發的項目夭折了,再深刻點的坑也遇不到了.沒有意外的話,短時間內也不會用了.
最近心情比較糟糕.寫得比較隨便.當個記錄好了.......

最後直接附上 github 源碼,多模塊模式開發用這樣的目錄結構也是不錯的,但願能幫到別人

相關文章
相關標籤/搜索