我的 CakePHP 3 評論 - 仍然新鮮,仍然很熱
已發表: 2022-03-11上個月,CakePHP 團隊宣布推出 CakePHP 3 的 alpha 版本。Cake 開發團隊認為版本 3 將改變遊戲規則,因此隨著版本 3 的 alpha 版本現已火熱出爐,本文采取重新審視 CakePHP 3 作為 PHP 開發的有效現代框架。
一個簡短的歷史
如今,在 PHP 開發方面有很多選擇。 隨著 PHP 的成熟,越來越多的 PHP 框架應運而生,為開發人員提供了廣泛的選擇。 但並非總是如此。
早在 2005 年,當 PHP 4 仍然是標準時,還沒有 PHP 框架,在 PHP 中開發麵向對象的編碼方法無疑是一個挑戰。 就在那時,CakePHP 出現了——有史以來第一個 PHP MVC 框架。 自首次發布以來的近 10 年裡,CakePHP 一直在不斷發展,在 PHP 開發人員中保持著健康的市場份額。
CakePHP 框架有多受歡迎? 它在 GitHub 上排名前 4 位最受歡迎的 PHP 項目,約有 130,000 個項目,CakePHP Google 組中有超過 18,000 名成員,有 32,000 個主題。 擁有 270 名代碼貢獻者和 320 名文檔貢獻者,不可否認 CakePHP 擁有大量追隨者。 CakePHP 當前的廣泛流行和日益流行在一篇文章中得到了很好的總結,James Watts 是 Cake 軟件基金會的 CakePHP 的核心成員和社區經理,我在撰寫本文的過程中採訪了他。
隨著該框架的第 3 版現已推出,CakePHP 無疑將繼續成為 PHP 世界的主導力量,並在當今各種 PHP 框架環境中成為主要競爭者。
CakePHP 第 3 版有什麼新功能?
這篇評論基於 CakePHP 3.0 的 alpha 版本,其中包含許多新功能和增強功能,包括:
更好的性能。 版本 3 對引導過程、路由過程和生成幫助模板的過程的幾個部分進行了性能改進。
增強的組件和助手。 第 3 版通過其新的 FlashHelper 和 FlashComponent 增強了對“閃存消息”的支持。 此外,CookieComponent 也得到了增強,可以更輕鬆地分離 cookie 命名空間的配置和 cookie 數據的處理。
改進的會話管理。 會話管理一直是 CakePHP 中的一個靜態類,已被證明在許多方面存在問題。 使用版本 3,您現在可以從請求對象
$this->request->session()
訪問會話。 此更改還使會話更易於測試,並使 CakePHP 能夠使用 PHPUnit 4.x。改進了約定的一致性。 應用程序骨架和插件骨架已更新為使用相同的目錄結構,以便彼此更加一致。
主題和插件合併。 CakePHP 3 的一個關鍵目標是使主題更加強大和健壯。 朝著這個目標努力,很明顯真正需要的是主題提供與插件相同的功能。 因此,任何插件現在都可以用作主題,這也簡化了打包和重新分發。
ORM 改進。 對 ORM(對象關係映射)進行了一些 API 更改。 最值得注意的是,現在為保存操作指定深度關聯更加簡單,並且更改了一些約定以減少新採用者的學習曲線和混淆。
此外,還計劃將一些附加功能納入 3.0 版的測試版中。 最重要的是:
- 國際化和本地化(i18n 和 L10n)功能增強
- 基於 Edge Side Includes 的 CacheHelper 替代品
- 一個新的路由 API,用於更簡單和更快的路由聲明
事實上,版本 3 代表了對 CakePHP 先前版本的重大升級。
為什麼選擇 CakePHP?
雖然 CakePHP 有許多很棒的特性,但這篇評論特別關註一些真正有助於使其與眾不同的特性,即:
- 約定優於配置
- CakePHP 的 ORM(對象關係映射)
- 組件和助手
約定優於配置
CakePHP 一直致力於快速和一致的開發,為此,CakePHP 非常重視約定。 因此,就像 Ruby on Rails(CakePHP 的大部分靈感都來自於 Ruby)一樣,CakePHP 嚴格遵守約定優於配置的原則。
約定意味著開發人員在學習如何使用 CakePHP 框架時不必考慮“事情的發展方向”,因為這些規則的默認設置已經到位。 雖然確實需要熟悉 CakePHP 約定,但一旦掌握,開發人員就可以專注於核心開發,而無需擔心代碼的放置位置和其他配置問題。
CakePHP 的約定與 PHP 本身形成鮮明對比,後者是一種相當自由的語言。 由於其約定,CakePHP 有助於確保跨多個開發人員甚至跨多個團隊的編碼風格和結構更加一致。 通過採用一套標準的約定,Cake 努力使開發更加一致。
例如,對於數據庫模式,CakePHP 就如何命名某些變量、表名和字段做出某些默認假設。 具體來說,Cake 期望:
- 表名將是複數(例如,
orders
) - 主鍵字段的名稱將是
id
- 任何外鍵字段的名稱都將基於引用的表名稱後跟
_id
(例如,customers
表的外鍵將命名為customer_id
)。
為了說明這一點,讓我們考慮對博客文章數據庫中的兩個表( articles
和users
)的簡單回顧。 在我們的示例中,我們會說Articles
“BelongsTo” a Users
和Users
“HasMany” Articles
。 這些關係將在 CakePHP 3.0 中指定如下:
In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users'); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles'); } }
CakePHP 採用默認約定,因此在獲取任何關聯時自動知道要查找的外鍵(即, articles
表中的user_id
)。
不過,需要強調的是,CakePHP 3確實允許輕鬆覆蓋其默認約定。 例如,假設我們在users
表中的外鍵被稱為author_id
而不是user_id
。 指定它只需要對我們的代碼進行以下兩個小改動,讓 CakePHP 知道我們沒有使用默認值:
In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users' => ['foreignKey' => 'author_id']); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles' => ['foreignKey' => 'author_id']); } }
因此,儘管約定確實是 CakePHP 不可或缺的一部分,並且確實有它們的優勢,但在必要時覆蓋它們確實非常簡單,正如我們在這裡展示的那樣。

雖然一些開發人員可能更喜歡不那麼依賴約定的 PHP 框架(例如 Yii 和 Laravel),但 CakePHP 約定實際上是非常有利的。 它們可以幫助 CakePHP 開發人員在負責增強或維護其他開發人員編寫的代碼時顯著減少啟動時間,因為它們導致多個 CakePHP 開發人員和項目之間的編碼結構和約定一致。
CakePHP 的對象關係映射 (ORM)
CakePHP 的對象關係映射 (ORM) 極大地受益於 CakePHP 的框架約定。 通過按照 Cake 的標准設置數據庫模式,您可以通過 Cake 強大的 ORM 快速將表連接在一起。 您很少需要編寫 SQL 語句,因為 CakePHP 可以輕鬆處理諸如表連接、 hasMany
甚至hasAndBelongsToMany
關係之類的事情。
利用 CakePHP 的ContainableBehavior
,通過模型關聯,您可以指定從 SQL 查詢中選擇哪些數據庫表和字段。 這可以深入幾個表,並且通過 ORM 可以輕鬆快速地構建高度複雜的 SQL 語句。
順便說一句,CakePHP 的ContainableBehavior
是一個很好的例子,說明了 CakePHP 如何簡化和簡化 PHP 開發。 它可以幫助您以乾淨一致的方式搜索和過濾數據,還可以幫助提高應用程序的速度和整體性能。 (它通過臨時或永久更改模型的關聯來工作,使用提供的容器生成相應的一系列bindModel
和unbindModel
調用。)
ORM 的挑戰在於它使 SQL 的使用變得如此簡單,以至於如果開發人員不小心,他或她可能會毫無意義地編寫低效的 SQL 查詢。 我當然多次看到寫得很糟糕的 Cake 應用程序並沒有簡化他們的查詢。 這些問題往往會在系統部署幾年後浮出水面,此時數據庫變得越來越大,編寫錯誤的查詢變得越來越慢。
這裡的主要問題是,在最新的 CakePHP 版本 3 之前,Cake 的 ORM 默認情況下會在執行查詢時檢索任何關聯的表。 因此,一個簡單的“查找所有”查詢可能會變得非常臃腫,因為底層 SQL 將從所有關聯表中檢索所有數據。 在版本 3 中,此行為不再是默認行為。 (在之前的 CakePHP 版本中,這個默認行為很容易通過簡單地添加public $recursive = -1;
到你的主AppModel.php
文件來禁用。)
總的來說,對 Cake 的 ORM 的回顧表明它確實有助於簡化開發,如果使用得當,它是快速構建複雜查詢的絕佳工具。 儘管如此,開發人員花時間充分理解 ORM 並確保他們的查詢得到適當優化(在任何語言中都是如此)是至關重要的。
組件和助手:CakePHP 庫
CakePHP 的一大特色是內置庫——組件和助手——消除了許多無聊、重複和乏味的開發任務。 在 MVC 上下文中,組件幫助簡化控制器開發,而幫助程序簡化視圖編碼和邏輯(即表示層)。
例如, PaginatorComponent
會根據查找查詢自動神奇地構建下一頁/上一頁界面。 添加JsHelper
,突然間你有了 AJAX 分頁,由你最喜歡的 JavaScript 框架(默認為 jQuery)提供支持。
其他有用的 Helpers 的快速示例包括:
-
TimeHelper
:使顯示日期和時間變得輕而易舉,提供了一套用於格式化和評估時間值的函數。 -
NumberHelper
:為以各種常見(或自定義)格式和精度顯示數字提供方便的方法。 -
TextHelper
:幫助啟用鏈接、格式化 URL、圍繞所選單詞或短語創建文本摘錄、突出顯示文本塊中的關鍵詞以及優雅地截斷長段文本。
還有更多。
CakePHP 3 的批評
可以肯定的是,每個框架都有其優點和缺點,CakePHP 也不例外。 以下是本次審查之外對 CakePHP 的一些最常見的批評:
“傳統框架; 臃腫而緩慢。” 這種批評通常更像是一種歷史批評,今天的真相有限(如果有的話)。 支持早在 PHP 4 的 PHP 版本在歷史上需要 CakePHP 來處理 PHP 自身的許多遺留問題。 隨著 PHP 的成熟,尤其是 CakePHP 第 3 版的發布,這種說法確實失去了效力。
“過於嚴格和局限。” 雖然 CakePHP 約定有明顯的優勢,但仍然有人批評它們。 批評者經常爭辯說這些約定過於嚴格,但他們沒有認識到(或承認)這些約定很容易被推翻。 通過採用一套標準的約定,Cake 試圖使開發保持一致,考慮到 PHP 在其他方面鬆散的編碼實踐,這應該被視為一件積極的事情。
“緩慢的發布週期”。 緩慢的發布週期不一定是壞事。 相反,過於激進的發布週期實際上可能會帶來更多問題。 事實上,CakePHP 主要版本需要時間的部分原因是為了確保與仍然廣泛部署的早期版本的 PHP 向後兼容。 此外,這種保守的發布週期和對向後兼容性的強調消除了在發布新版本時對代碼進行重大(和頻繁)更改的需要。 還應該注意的是,對於每月發布的次要版本(錯誤修復、補丁、次要增強等),CakePHP 3 團隊一點也不慢。 同樣,大多數錯誤通知單在發布後的數小時內都會得到答复。
“不是開箱即用的解決方案。” 與許多其他現代“開箱即用的 web 應用程序”PHP 框架(例如 Yii)相比,CakePHP 有意支持和啟用自定義解決方案。 在開發許多大型、自定義、數據庫驅動的網站和應用程序時,我個人從中受益匪淺。
“使用數據數組而不是對象。” 從版本 3 開始,這不再適用。在以前的版本中,任何數據都需要作為嵌套數組進行存儲和引用(例如,
$user['User']['username']
)。 CakePHP 3 最終解決了這個問題,而是將數據存儲為對象(例如,$user->username
)。“糟糕的文件。” 這種批評是有道理的,因為 CakePHP 文檔似乎並不總是為初學者編寫的(重要信息有時只用一兩句話討論,而幾段討論可能是有道理的)。 Cake 開發團隊意識到了這一點,並正在努力相應地改進文檔。 事實上,CakePHP 3 文檔的主頁明確聲明了對文檔“質量、有效性和準確性”的高度承諾。 由於 CakePHP 是一個社區驅動的框架,因此在文檔的每一頁上都提供了一個“改進此文檔”按鈕,允許並鼓勵 CakePHP 用戶對文檔做出自己的添加、刪除或更正。
結論
總而言之,在其首次發布近 10 年後,對 CakePHP 的評論表明,它仍然是許多其他 PHP 框架的生機勃勃且強大的競爭對手。
CakePHP 是一個完整而全面的開發解決方案。 代碼庫成熟,功能似乎無窮無盡。 總體而言,Cake 的構建旨在加快開發速度,這不僅對軟件開發人員很重要,對投資者也很重要。 軟件開發的最大成本是開發時間成本,CakePHP 旨在顯著減少開發時間。
CakePHP 是一個社區運行的項目。 隨著越來越多的人參與進來,它只會變得更好。 參與 7 年並看到社區不斷發展壯大,我對 CakePHP 的下一個階段感到興奮。 CakePHP 3 的推出,以及 PHP 和 CakePHP 的成熟,意味著該框架將繼續變得越來越好。
如果您正在尋找一個基於 PHP 的解決方案,它提供許多類似於 Ruby on Rails 的優點(在易用性和約定優於配置方面),那麼不妨試試 CakePHP。 不過,CakePHP 博客教程只需要幾分鐘的時間來設置和運行,或者,CakeCoded 提供了一系列清晰的課程來幫助 PHP 開發人員熟悉 CakePHP 並開始使用它。 通過這些資源,您將很快看到 CakePHP 可以在多大程度上加速和增強您的 PHP 軟件開發工作。 享受!
Michael Houghton 是駐愛爾蘭的 Toptal 工程師,擁有豐富的 CakePHP 經驗。 他使用該框架開發了 100 多個網站,與 CakeDC(CakePHP 框架背後的商業實體)的團隊合作,提交了各種補丁,並幫助編寫了 CakePHP 文檔。