問題描述

有些人認為 WordPress 是一個博客平台,有人將其視為 CMS,有人將 WordPress 視為開發框架。無論哪一個,問題仍然存在。是否符合 WordPress MVC?

三年前我已經看過論壇,有人問過 MVC 。有一些積極的答案,一些負面的答案。雖然沒有人知道 MVC 是什麼,每個人都以自己的方式認為,但仍然存在所有討論中的一般概念。

我對 MVC 框架沒有什麼經驗,而且框架本身似乎沒有什麼。大多數 MVC 是由程序員完成的,我是對的嗎?現在回到 WordPress,我們可以考慮控制器的核心重寫引擎 (WP_Rewrite) 嗎?查詢& 插件邏輯作為模型?和主題作為觀點?還是我錯了?

謝謝 😉

最佳解決方案

WordPress 本身不是在 MVC 中架構的,而是可以在框架內構建非常面向 MVC 的主題和插件。有幾個工具可以幫助:

WordPress MVC 解決方案:

WordPress.org 上的 MVC 主題想法和 Trac:

次佳解決方案

WordPress 是 kinda-sorta MVC 。如果有什麼是 pull-type MVC 佈局,那麼來自模型的查看’pulls’ 數據。它以非常先進的方式進行,而不是使用大量不同的對象,但這實際上使得前端模板更容易以很多方式編寫。

這也給出了一些程度的控制器邏輯 (因此是 kinda-sorta MVC) 。

讓它運行下來:Wordpress 獲取一個 URL 。 wordpress 核心充當控制器,並確定哪些初始查詢運行數據庫,並通過擴展,應加載什麼視圖 (類別視圖,單個頁面或頁面視圖等) 。然後打包 INTIAL 查詢響應並將其發送到視圖文件。

該視圖文件可以是嚴格的僅顯示文件,或者可以請求超出內置的其他信息/查詢。這是 MVC 的 pull-type,其中的視圖從模型中提取數據,而不是從模型中將控制器’pushing’ 數據拉入視圖。

因此,當視圖看到加載邊欄或窗口小工具區域的代碼時,它會詢問該信息。但是,什麼小工具應該在那裏由控制器確定,它查看側邊欄中的小工具的模型,然後選擇設置為在當前頁面上顯示的部件,並將其返回到視圖。

它的每一部分都不是一個對象,並不能使 MVC 更少。你可以改變 WP 核心,而不用 (一定) 改變任何關於主題的東西。同樣,只要使用像’get_pages()’ 這樣的內置函數,只要這些函數仍然返回正確的數據,模型和數據庫表就會發生變化。因此,該模型獨立於視圖,並且控制器也是獨立的 (除了當視圖添加控制器邏輯以做比核心通常更多) 時。

雖然你可以有一個模型對象持有許多方法和東西,如 WPModel :: get_pages(‘blah blah’),幷包含所有這一切,仍然存在着根本的分離問題。

查看:模板文件控制器:WP 核心模型:處理特定數據處理的各種功能。

只要姓名,論據等保持一致 (或者只是添加新的名稱),那麼保持關切的分離,可以在不打擾別人的情況下進行改變。

它不是 MVC 的 super-clean 版本 (特別是在鈎子涉及的時候),但是從基礎開始它就開始了。

而且正在進行中,這不是一件壞事 IMO 。來自網站的請求本質上是一個循序漸進的過程:一個清晰的開始和結束的過程,只需要一個處理請求,獲取數據,打包,然後死機的過程。您可以使用對象和對象方法和 OOP 佈局來設置這些步驟 (這將使一些事情變得更容易),或者您可以編寫大量的函數調用並將它們分開。類成員像私有變量這樣丟失,但根據應用程序的需要… 你可能不在乎。

沒有 one-grand-way 來開發,而 WP 就像 20%的網站一樣,所以它正在做正確的事情。可能與不要讓人們學習/記住複雜的類層次結構以使數據庫能夠回答 「什麼頁面是頁面 x 的孩子」 的問題有關。並處理該數據。你能用 OOP 這麼容易嗎?是的,但是如果 Joomla 是使用 OOP 來實現複雜的自定義網站的難點,那麼 WP 更容易和快捷,時間就是金錢。

第三種解決方案

如在評論中已經提到的,MVC 是一種建築設計模式,而不是一個特定的框架,而不是,Wordpress 不遵循 MVC 模式。

有一個從編程邏輯中分離的視圖 (模板),但是隻有在前端,而不是在管理面板中,一般分離視圖和應用程序邏輯不是不可避免的 MVC 。 MVC 模式的實現通常假定某種面向對象的編程範式,Wordpress 主要以程序方式實現,在 PHP 函數中使用純 SQL 查詢,因此也沒有實際的模型。

第四種方案

只是為了更新這個更新的信息,人們從搜索引擎中擊中這個 – wp-mvc 插件 http://wordpress.org/extend/plugins/wp-mvc/在創建一個 mvc 框架的插件開發方面有很長的路要走。你可以在這裏找到更多:http://wpmvc.org/documentation/70/tutorial/

第五種方案

只是添加到選項列表 (我承認有偏見的作者,)swpMVC 是一個功能齊全,輕量級的 MVC 框架,靈感來自 Rails,Sinatra,Express 和 FuelPHP 。這是完全記錄的,當我使用和喜歡 wp-mvc 時,我想要一些模型能夠自己填充意見的東西,包括與所述模型交互的表單控件。

我把它放在一起大部分是為了減少控制器代碼所需的數量,將一個應用程序放在 WordPress 之上,結果是在 WordPress 中運行的非常快速和有效的框架。這些模型基於 PHP Activerecord,現有 WordPress 數據類型包括 8 個模型,包括 Post,PostMeta,User,UserMeta,Term 等等。由於 activerecord 庫,建模數據非常簡單,而且我非常喜歡這個框架。

還附帶下劃線 PHP 和 PHP Quick Profiler(如 FuelPHP 所示) 。

第六種方案

與 WordPress 有關的定期討論的主題之一是 WordPress 和 MVC 的想法。

但事實是,MVC 並不是網絡開發的一個子彈,我們試圖使它成為。是的,這是一個令人敬畏的設計模式,我個人認為它適合 Web 應用程序模型,如手套,但並不是每個框架或平台都實現了這種設計模式。

例如:WordPress 不是 MVC 。

沒關係我想我們需要放棄嘗試將它們插入我們的項目,特別是當 WordPress 提供的模式不僅足夠,而且在正確利用時效果很好。

「但我愛 MVC!」

我也是!事實上,我去年在 more-or-less 模擬 MVC 架構的項目上工作。 MVC 的一個 high-level 例子。

MVC 的一個 high-level 例子。

例如:

Views were implemented using templates
Controllers were implemented by a combination of using function names like create, read, update, destroy, delete, and so on (even though these functions were hooked into the WordPress API
Models were functions also were called to validate and verify data prior to serializing the data. Again, this required that certain functions be hooked into WordPress to achieve the desired result.

最後,一組重寫規則為應用程序提供了一組乾淨的可預見的 URL,格式為/people /update /1 或/people /all 。 WordPress 實現什麼模式?

WordPress 實現了 event-driven 架構 (其中有幾種變化,如 Observer 模式) 。

簡而言之,你可以從概念上考慮這一點:

Things happen when WordPress is processing information.
You can register your own function to fire when these things happen.

不是太複雜了嗎? high-level event-driven 圖案的例子 high-level event-driven 圖案的例子

當你開始思考其工作原理的方式,而不是試圖讓它工作的方式,你想要它的工作,它的解放。它有助於更​​容易地解決問題。

底線是這樣的:WordPress 實現了 event-driven 設計模式,所以即使你最終試圖實現 MVC,你仍然需要利用掛鈎系統。

如果你不小心,你可以最終嘗試製作完美的建築,而不用完成你的工作,因此最終會發現自己在軟件的氣氛中如此高效,你已經有效地成為了宇航員。所以你説避免設計模式?

一點也不!設計模式有一個目的,因為首先,他們基本上為我們解決了以前和常見的解決問題的解決方案。使用它們!

但是我想要做的是,我們不需要試圖強迫事情適合模式,只因為我們喜歡模式。這不是他們的目的。相反,利用您選擇的平台實現的主要模式 – 在我們的例子中,它是一個 event-driven 模式,然後實現它們適合的模式 (如依賴注入或類似的東西) 。

否則,就像試圖把你的腳放在手套裏。

禮貌 (並完全複製:P) 從:http://tommcfarlin.com/wordpress-and-mvc/

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。