phalcon架構使用指南_php執行個體

來源:互聯網
上載者:User
初次認識phalcon是在剛學php的時候,最近終於有機會用上了.故此說說使用上的一些感受

個人是很喜歡phalcon這套架構的方式,使用依賴注入,讓程式碼群組織很靈活,耦合也很低.但是,也許是架構東西太多了,遇到幾個坑. github上一年以上的issue也還沒解決.不過有一定開發經驗的話,還是可以自己修複的.被這幾個坑浪費了不少時間....

第一個是view.

  phalcon的view,可以分成兩大部分,一是全域的layout,二是controller/action的部分,  讓使用時更加方便,設定好layout後,只關注controller部分的view即可.  但是關於view的路徑設定問題,要關注這幾個參數

MainView(主layout檔案路徑+檔案名稱,但不包括副檔名,副檔名是在注入視圖引擎時的key索引值),

LayoutsDir(layouts的目錄路徑),

Layout(主layout檔案名稱,可根據需求,動態使用layouts目錄下的某個檔案充當mainView),

PartialsDir(使用partial函數時,尋找模板檔案,如partial('main/header') 則尋找路徑是"/你的partialsDir/main/header.volt" . ),

ViewsDir(設定controller/action對應的模板檔案所在的目錄.和partialDir類似,自動尋找目錄下的模板檔案)

BasePath(視圖的目錄的基礎目錄,phalcon和根據所有設定的dir來組合路徑,尋找模板檔案,坑就是這了)

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

一氣之下就去翻phalcon的源碼了.開發語言是Zephir,phalcon團隊自己開發的語言.

語言文法比較簡單,容易懂.然後看到了這句.

..]

看起來像是沒有判斷是相對路徑還是絕對路徑,直接組合起來了而已的,猜測是這裡引發了問題.

並且是直接按順序解析action , layout , main layout這些模板檔案.

於是想驗證一下.所以我寫了幾個調試檔案,打算調試一下.

翻查phalcon源碼過程省略1000字...找到必然會調用,並有路徑處理的幾個主要方法,繼承View相關的幾個class

這裡也強調下,很多人喜歡用echo,一般情況是沒問題,但最好還是用檔案記錄吧,因為echo局限性其實挺大的,你不知道echo buff什麼時候開啟,什麼時候關閉..使用檔案來記錄log最保險了.

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

BaseView檔案,繼承phalcon的view,並且開啟這個方法的報錯資訊

BaseVolt檔案,繼承模板引擎volt

view注入代碼,和目錄結構

log記錄如下

頁面輸出如下:

跟想像的一樣,使用絕對路徑時,無論如何,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一樣,自己修複好...

個人認為setter getter是非常好用的功能,但有些人卻覺得沒用,見仁見智啦.我們的開發模式是model和controller 由不同的人開發,有了setter getter,資料調用者只管拿資料就可以了,model資料出問題,在model中修改即可,controller不需要改動.工作模式上耦合可以降低很多.

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

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

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.