2010-11-07 61 views
9

剛剛遇到Doctrine有一個對象關係映射器和數據庫抽象層的項目。 Doctrine提供的其他PHP抽象層沒有提供什麼?除了通過以Doctrine Query Language編寫的查詢獲取對象之外,還可以將ORM放到哪些實際用途?查詢語言是否真的是您想要開發整個Web應用程序的東西?它表現不錯嗎?使用Doctrine for PHP的優點?

整體而言,在Doctrine上構建一個應用程序會使它更易於維護和理解嗎?它是否過度設計,並且建立在一個適合中小型項目的抽象層上? (< 50個GUI屏幕),而不是直接使用MySQL。

回答

15

Doctrine提供的其他PHP抽象層沒有提供什麼?

  1. 實現DataMapper模式而不是ActiveRecord。
  2. 支持annotations,用於模式的XML和YAML。
  3. 用途DQL
  4. 使用PHP 5.3+的好處。
  5. 速度快,擁有大型社區。
  6. 除了ORM外,還有ODM。

是查詢語言真的是你想開發一個完整的web應用程序的東西嗎?

只是負責維護業務對象的應用程序的一部分應該知道Doctrine的存在。而這一部分不一定是100%主義的。

整體而言,在Doctrine上構建一個應用程序會使它更易於維護和理解嗎?

當然。代碼更易於閱讀,理解和維護。

它過度設計,是否適合中小型項目?

其實主義在其基本面上相當簡單。對於小型,中型甚至一些大型應用來說,這是一個非常好的選擇。


學說不是一切的答案,有時它有點問題。但是對於典型的任務來說,這非常有用。恕我直言,此時此刻PHP是最好的ORM/ODM。

2

我想補充幾點Crozin的答案,但不幸的是不能評論它。它們是:

  • 學說不使用魔術方法__get()和__set()來訪問實體屬性,所有的實體屬性都應該有getter/setter。這改進了IDE代碼的完成,並且您不需要一直查看數據庫表結構。
  • 主義完全從真正的表字段名稱中抽象出來。將實體屬性映射到數據庫字段後 - 您可以在任何地方使用屬性名稱。表名相同。
  • 主義使用隱藏獲取實體的細節信息庫模式。
  • 學說利用「代碼優先」的方法,所以你可以先創建實體,然後自動爲它們生成數據庫。反向情況也是可能的。
  • Doctrine擁有強大的查詢構建器,因此您可以利用構建器模式查詢帶有條件的部分。
  • Doctrine使用外鍵和約束來執行級聯操作並保持數據一致。
  • 主義的的UnitOfWork是一個非常偉大的和智能的事情,這在其他PHP的ORM沒有模擬

恕我直言,在目前的學說提供了所有可用的PHP的ORM中最好的IDE代碼完成支持和DB抽象層。它不是過度設計的,遵循固體原則。

0

我想給GerKirill的答案補充一點。沒有支持魔術吸氣/二傳手方法是一個弱點,恕我直言,而不是一個實力。如果你瀏覽過幾十頁相同的getter/setter,你會意識到這些方法對空間的浪費是非常大的(更不用說編譯時間了)。沒有人不小心設置了一個對象變量,而一個setter並不妨礙你這麼做......當你想改變屬性時,你只需調用setter(setter如何「保護」屬性 - 如果你是打字錯誤,直接設置錯誤的屬性值,你會犯同樣的錯字,並調用錯誤的setter)。對於一個設置者或獲取者來說,除了獲取或設置一個屬性之外,其他任何事情都非常罕見。如果你必須做一些特殊的設置或獲取屬性,該屬性應該是一種方法(見http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html),或者你應該重構你的代碼,或者你應該調用一個屬性驗證函數(通常在對象是創建)。這是困擾OO世界的那些不受挑戰的真理之一。在發佈標準的已收到智慧答覆之前考慮一下。