2011-02-02 8 views
11

私は、Zend FrameworkではZend_Dbの代わりにDoctrine 2を使用するユーザーがいることを知っています。しかし、私は理由を知らない。 Doctrine2がZend_Dbより優れている理由とZend_Dbがうまくいかない理由あなたは小さなプロジェクトのウィッヒは、特定のDBMSを使用するためにバインドされている場合はDoctrine 2をZend Frameworkで使用する価値はありますか?

おかげ

答えて

25

(2011年3月7日)免責事項:この回答は多分古くなったでしょう。私は現時点でPHPコミュニティに追いついていません。この比較はDoctrine ORM v2とZend Framework v1の間の比較です。これは2つの異なることから、リンゴとオレンジの比較です。


はすぐにはZend_Dbは教義2は、オブジェクト(それ自身のDBALの上に座って)リレーショナルマッパーであるようPDOの上に、より公正強化されたデータベース抽象化レイヤです。

Doctrine 2は、ビジネスロジック、永続性ロジックなどがすべて複数のクラスに分かれているため、複数の役割を果たさないため、より複雑なドメインレイヤーの方がはるかに優れています。また、クリーンでゆるやかに結合されたクラスが増えているので、テストがはるかに簡単になります。

また、エンティティオブジェクトを操作でき、Doctrineがそれらの変更をデータベースに変換するため、Zend_Dbを使用しているSQLのほんの一部しか書かれません。また、生成されたSQLは、パフォーマンスを向上させるトランザクションを利用します。

Doctrine 2がすごく優れている理由を理解するために、ドメインドリブンデザインをお読みになることをお勧めします。

あなたはZend_DbのでDDDを行うことができます、しかし誤解しないでください、それが本当にOOTBではありません(それはORMはないので)、とDoctrine 2

のようなほぼ同じくらい強力で、フル機能のではないでしょう
+1

合意。 Zend_Dbは、中規模または大規模プロジェクトの混乱です。 Doctrineでは、各エンティティごとに1つのリポジトリがありますが、Zend_Dbを使用するとZend_Db_Tableが拡張され、テーブルデータゲートウェイパターンが使用されます。getAllAllowedUsers()などのメソッドを含むカスタムSQLがいくつかのテーブルに加わり、あなたの実際のビジネスモデルには何もありません。 Zend_Db_TableをRepositoryパターンとマージします。おそらく、実際にはデータマッパーが必要なことを理解しているので、独自のインプリメンテーションを作成して、ホイールを再開発します。 –

+0

または最悪の場合:開発者によっては、コントローラ自体に選択肢が作成される場合があります。 –

+0

私はこれが古い質問だと知っていますが、2年間の教義2 + zendフレームワークの経験では、私はdoctrine 2 IT IS SLOWを使用することを絶対に推奨しませんSLOWは、Webアプリケーションには適していませんが、偉大な抽象性を持っていますが、大きな欠点もあります。 – albanx

0

は、あなたはORMとDoctrineを必要としません。

プロジェクトのウィッヒが大きく、将来的にあなたが教義

を使用して検討するかもしれないよりも、別のDBMSから切り替えるためのアダプタが必要になる場合があります持っている場合は、教義の説明で読むことができたよう:

Doctrine 2は、オブジェクト・リレーショナル PHP 5.3.0+のマッパー(ORM)で、 は PHPオブジェクトに透過的な永続性を提供します。それは 強力なデータベース抽象化レイヤー (DBAL)の上に位置します。オブジェクトリレーショナルマッパー プライマリタスクは、(PHP)オブジェクトと のリレーショナルデータベース行の間の変換 の変換です。

+1

"large"を定義してください:-)ありがとう – opHASnoNAME

+1

あなたの回答は、ORMの主な利点はDBMS移植性であることを意味します。しかし、普通のPDO - または実際にはDBAL - はそれを提供します。ORMの本当のメリットは、モデルそのものとリポジトリ間の永続性/水和性の間の明確な区別です。 –

0

Zend_DBとDoctrineは異なる方法を使います。 Zend_DBはテーブルデータゲートウェイと行データゲートウェイのように動作します。 Doctrineはオブジェクトマッパーです。

私の経験では、ほとんどの一般的な作業には十分かつ高速です。 Doctrineは遅く、Zend_DBよりも多くのメモリを使います。

+0

私の経験では、ビジネスロジックとデータアクセス層を明確に分離していないコードを維持するのは難しいです。モデルを扱うときは、アクティブレコードの類似パターンを使用する傾向があります。たとえば、Zend_Db_Table_RowとZend_Db_Tableを拡張したり、独自のデータマッパーとリポジトリ(リポジトリパターン)を作成することさえできます。小規模なプロジェクトやチームにとっては間違いありません。 –

関連する問題