對 ZF Actionstack 的負面評價

edited 十一月 -1 in Zend Framework
一個社群朋友詳細描述了 ZF Actionstack 中存在的問題
http://www.rmauger.co.uk/2009/03/why-the-zend-framework-actionstack-is-evil/

主要是它造成了一些效能瓶頸,也讓架構變得複雜。

其中提到一個觀念:
Fat Models, Thin Controllers

過去對 Fat Models 印象比較深刻是 CakePHP 核心成員一直在強調這個觀念,發現用 "Fat Models controller" 當作關鍵字還可以找到蠻多的參考資料。

簡單的說就是盡可能將程式碼寫在 Models 中,不要在 Controller 搞太多花樣 ;)

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=3975

評論

  • edited 五月 2009
    'Why the Zend Framework Actionstack is Evil' 這篇文章的作者提到的問題
    不盡然是ActionStack的責任
    我認為如果系統架構設計妥當 ActionStack 可讓程式碼看起來更精簡
    Zend Framework的整個life cycle充斥著許多loop, 為的是使其能更有彈性地被運用
    而ActionStack是其中之一, 其他還有複雜的dispatch loop
    ZF裡的plugin broker和helper broker也是loop成群
    系統架構者只要小心不要讓造成無限迴圈就不會讓系統掛掉
    換句話說ActionStack是多一個工具 但是因為太強大所以需要小心使用
    另一點是 由於串聯了多個Action 一起執行 所以容易造成無法追蹤現在執行到哪的狀況(loose track)
    這個特性在debugging的時候困擾最大
    補充一點 Action Controller 裡常常使用的forward()函式
    幕後其實也是用ActionStack在實行的
  • edited 五月 2009
    附帶一提, Fat Models, Thin Controllers在ZF裡的實行(Implement)方式
    建議可以讓單單read-only的view file, 透過view helpers的輔助, 直接向Model layer要資料
    所謂的read-only view, 指的是不用對資料庫寫入資料的
    比方說"新聞列表"就不用寫入資料, 只需要讀取
    反例"會員資料修改", 就需要對資料庫寫入

    如此, 廣義來說, 可以跳過經過Controller的不必要傳遞
    對ZF系統好處尤其大, 因為ZF中繁雜的hooks
    讓一個Controller Action執行起來異常厚重
    又一般網頁大多都是讀多於寫
    View與Model的直接對話並無破壞MVC的結構
    只是打破操作Model Layer一定要經過Controller Layer的迷思

    這裡有一篇 Matthew Weier O'Phinney 寫的文章
    View Helpers in Zend Framework
    介紹View Helpers的用法

    另有一篇Pádraic Brady寫的文章
    Complex Views with the Zend Framework - Part 2: View Helper Pattern
    裡頭有如何實行透過view helper讓view files直接與model layer對話的範例
    若要傳遞變數, 也不會有問題
    事實上, 這種做法還蠻常見的
  • edited 五月 2009
    MVC 的概念就是為了將各種邏輯拆開來,藉此避免重複的程式出現。

    如果取得資料的程式寫在 View 中,而程式希望有著不同的呈現介面,像是一般網頁、手機上的網頁等等,取得資料的部份就會重複出現。當然,在 View 中也可以把取得資料的部份抽離、獨立,讓它可以被重複運用,但角色似乎就跟 Controller 重疊了。

    大部分的 Framework 都不會禁止你在 View 中直接跟 Model 溝通,只要你願意多寫些程式;任何的方法都有其利弊,只要你能夠善用並且養成些好習慣,相信都是好事。

    JAVA 也是因為區分了太多階層所以在效能上引人詬病,但不可否認的,這樣的階層成就了許多大型的應用。
Sign In or Register to comment.