2010-11-05 53 views
2

我被要求構建一個PHP應用程序,它將數據插入數據庫,然後允許用戶在數據庫上運行報告。構建PHP應用程序,困惑於設計模式

我有幾年的PHP開發經驗,幾年前,但我堅持。

我看了一下MVC,框架等物品......這一切似乎都改變了:)

什麼是最好的使用方法?我覺得自己一直陷入時間扭曲,現在已經回到PHP,它已經完全改變了。林問我所知道的一切:)我甚至不知道什麼目錄結構使用奠定應用程序了:)

我希望有人可以幫助和提供一些建議如何奠定應用程序出什麼設計原則使用等。 。

請幫IM完全失去了:)

編輯:我不希望有學習的框架,而是學習如何構建應用程序。 :)

+0

可能重複[指導,大規模PHP開發提示/技巧。](http://stackoverflow.com/questions/1940677/guidance-tips-tricks-for-larger-scale-php-development) – Gordon 2010-11-05 10:06:35

+0

[這本書](http://www.amazon.co.uk/Objects-Patterns-Practice-Experts-Source/dp/143022925X/ref=sr_1_1?ie=UTF8&qid=1288951406&sr=8-1)真的幫助我讓我加快來自古代PHP 3&4代碼的速度。 – Wrikken 2010-11-05 10:27:11

回答

2

我喜歡你的想法。我看了一下CodeIgniter,Cake和其他框架,雖然他們很好,但我決定寫我自己的。我學到了一噸。我的框架的第一次修改並不是很好,但我有兩個運行的站點沒有問題。它的第二版可能不如Cake等成熟,但它使構建PHP應用程序變得輕而易舉,對我來說最關鍵的是:我知道每行代碼的作用,並且它非常快速地更改和調試

我認爲做的第一件事就是要想想你將如何打破應用到層,明顯的候選人是:

  • 前端控制器:它解析URL,並決定做什麼用的類他們。現在大多數框架使用Apache mod-rewrite規則將所有URL轉發到一個類 - 所以它是您的應用程序的單一入口點。
  • 數據庫抽象層:將您讀取/寫入數據庫的所有代碼放在一個地方,並讓所有內容都可以調用。也被稱爲ORM。
  • Models:代表數據庫中一個或多個表的類。
  • 控制器:更新/讀取模型,應用邏輯並填充和顯示視圖的類。
  • Views:從您的控制器導入數據的HTML文件。我使用Smarty。

因此,採取這些元素,你有一個基本的目錄結構:

/models 
/controllers 
/includes 
/views 
/css 
/js 
index.php 

的index.php是我的前端控制器。我把ORM的東西和其他幫助類用於處理表單和東西進入/ includes目錄。很明顯,/ css和/ js包含你的靜態JavaScript和CSS文件。

前端控制器的工作原理是,您擁有指定要創建哪個控制器的URL,如:www.domain.com/product/1/hello-world。產品是類的名稱(我稱之爲我的控制器控制器) - 所以在這裏,我的前端控制器將讀取URL的產品部分並創建一個ProductController的實例。

控制器根據它們給出的URL的其餘部分採取行動。所以ProductController得到1和hello-world的參數。 1可能是要加載和顯示的產品的索引。你好,世界只是SEO文本忽略。您也可以指定要調用的函數,所以www.domain.com/product/list - 這次您創建ProductController並調用列表函數。

有不同的方式來構建MVC應用程序,論壇充滿了關於它的爭論 - 我上面提到的或者可能不是真正的MVC,但主要目標是獲得良好的抽象到您的應用程序。

我建議檢查一下你的視圖層的Smarty。它是一個穩定的庫,並提供HTML緩存。

+0

謝謝史蒂夫:)非常豐富和更多我以後:) – ard 2010-11-05 10:48:48

2

首先,選擇一個框架。然後,遵循它所需的目錄結構和它使用的設計原則。

+0

我真的不想使用框架:)我只是把它看作是我所需要的並非真的重新學習php,它更像是學習「框架語言」。 – ard 2010-11-05 10:00:54

+4

作爲一種語言,PHP是非常混亂和混亂的,即使您不認爲應用程序允許它,您也應該使用*某些類型的框架。 – 2010-11-05 10:02:45

+0

這將意味着即時通訊實際上並沒有學習如何構建一個PHP應用程序,但如何操縱一個框架?我的目標是學習如何構建完整的PHP應用程序,而不需要框架。 – ard 2010-11-05 10:06:07

0

框架是確保您採用最佳實踐的簡單方法。但是在一個小項目中,你可以很容易地採用沒有框架的良好實踐。您所需要的只是一個類或一組函數,它們可以完成與數據庫的所有交互。這些將根據您傳遞給它們的參數生成SQL查詢。那麼所有的非數據庫邏輯應該保持分開。或者,您可以創建一個或一組函數來處理查看代碼(實際生成您的HTML的位),另一個處理兩者之間的位,但是如果您達到了這種級別的MVC複雜性,只是學習一個框架要快得多。

2

分解成步驟。考慮代碼將在哪裏重複使用。

雖然我沒有使用現成的框架,但我多年來一直在構建一個框架。不要小心框架,他們應該被擁抱。

例如,我的框架非常簡單和輕量級。當我開始一個項目,我創建兩個(有時三)目錄:

cms/ 
inc/ 
tpl/ 

他們是不言自明:CMS房子一個內容管理系統,如果需要的話; inc包含PHP腳本;和TPL包含模板和資產,如圖像,樣式表和JavaScript文件,並提供:

cms/ 
inc/ 
tpl/ 
    css/ 
    img/ 
    js/ 

然後我有一個index.php文件,需要一個請求(即http://www.example.com/news/2010/11/05/lorem-ipsum),它只是將請求匹配的腳本第一個分段(在上述情況下爲news.php),其餘的URL分段用作參數。因此,在我的示例中,獲取匹配日期(2010年11月11日)和文件名(lorem-ipsum)的文章。

不要過度設計的東西。首先進行計劃,你會發現一個清晰的頭腦,你會削減一些過度工程負荷。

+0

謝謝馬丁:) – ard 2010-11-05 10:23:40

+0

沒問題。祝你的項目好運! PHP仍然很有趣! – 2010-11-05 10:25:29

0

我真的知道你的感受。

我是一個老同學,我覺得我對所有這些新東西都有一點韌性。我不能確切地知道發生了什麼,不能使用工具。

對於框架宣傳員和大量生產的開發人員抱歉。我想當你使用框架,CMS或設計模式時,你會錯過所有的樂趣。學習它們值得一段時間。只是使用它們不是一件好事恕我直言。嗯,現在我們聽到很多關於面向對象,設計模式等等的東西。學習這些東西可以值得。但正如@Martin Bean所說,「不要過度工程」。 PHP將執行相同的操作,如果你使用結構化(包括,需要,功能),PHP可能會更好。您可以逐漸使用「新」資源,瞭解其基礎,因爲它們有意義,而且您感覺更舒適。

走安全道路。按照您所知的方式進行應用,並嘗試學習一兩件新事物。

1

不要重新發明輪子..使用Zend框架的http://framework.zend.com/,是一個最好的MVC結構你可以找到。 從他們的快速入門教程開始。

1

這不僅僅是一個PHP問題,更是一個軟件工程問題。有幾種軟件開發模式。 PHP支持一些比其他更好,但有一點創意,你可以實現幾乎任何設計。

Model View Controller

這是最常見的架構,你可能會遇到的網絡平臺。這個想法是將應用程序邏輯和數據從用戶界面中分離出來。這使得開發人員能夠提供多個接口(一個用於Web服務的移動接口,一個用於瀏覽器的移動接口 - 這一切都發生在視圖層),而無需更改應用程序的核心功能。模型層提供數據和(至某一點)業務邏輯。控制器層耦合模型(數據)和視圖(表示)。 Zend框架使用MVC,Django(Python)使用MVC的變體。

Model View Presenter

像MVC中,使用了一個模型(數據的東西)和視圖,但該控制器由呈現組件代替。表示組件背後的想法與控制器非常相似,但不同之處在於演示者在MVC中取消了某些視圖的責任。 MVP中的視圖嚴格用於渲染。 MVP主要用於繁重的UI應用程序和組件。 Windows窗體使用它。

Three Tier

的三層系統採用了表示層,業務邏輯層和數據層。表示層處理傳入請求,傳出響應和呈現內容。業務邏輯層進行真正的繁重工作。它處理請求並根據這些請求做出決定。數據層由實際數據組成 - 不管它是否存在於數據庫中,或者是您從中獲取數據的Web服務。

Presentation Abstraction Control

PAC像MVC,但很多更精細,並且所包含的內容非常像小MVC架構,都從彼此分開。這可能比你想要做的工作多得多。