9

オブジェクトリレーショナルマッパーとDB抽象化レイヤーを備えたDoctrineプロジェクトに出くわしました。Doctrineは、他のPHP抽象化レイヤーが提供しないものを提供しますか?また、Doctrineクエリ言語で記述されたクエリを介してオブジェクトをフェッチする以外に、ORMをどのように実用化できますか?クエリ言語は本当にWebアプリ全体を開発したいものですか?それはうまく機能しますか?

全体として、Doctrineでアプリを構築すると、保守と理解が容易になりますか?それは過剰に設計されており、中小規模のプロジェクトに適した抽象化レイヤー上に構築されていますか?(<50 GUI画面)、MySQLを直接操作するのとは対照的です。

4

3 に答える 3

15

Doctrineは、他のPHP抽象化レイヤーが提供しないものを提供しますか?

  1. ActiveRecordではなくDataMapperパターンを実装します。
  2. スキーマのアノテーション、XML、YAMLをサポートします。
  3. DQLを使用します。
  4. PHP5.3以降の利点を利用します。
  5. 高速で、大きなコミュニティがあります。
  6. ORMを除いてODMがあります。

クエリ言語は本当にWebアプリ全体を開発したいものですか?

ビジネスオブジェクトの保守を担当するアプリケーションの一部だけが、Doctrineの存在を認識している必要があります。そして、その部分は100%Doctrineベースである必要はありません。

全体として、Doctrineでアプリを構築すると、保守と理解が容易になりますか?

間違いなく。コードは読みやすく、理解しやすく、保守も簡単です。

それは過剰に設計されており、中小規模のプロジェクトに適していますか?

実際、Doctrineは基本的に非常に単純です。また、小規模、中規模、さらには一部の大規模なアプリケーションにも非常に適しています。


教義はすべての答えではなく、時には少し問題があります。ただし、一般的なタスクの場合は非常に便利です。私見は現時点でPHPに最適なORM/ODMです。

于 2010-11-07T17:29:40.183 に答える
2

クロジンの答えにいくつかポイントを付け加えたいのですが、残念ながらコメントできません。はい、どうぞ:

  • Doctrineはエンティティ属性にアクセスするために魔法のメソッド__get()と__set()を使用しません。すべてのエンティティ属性にはgetter/setterが必要です。これにより、IDEコード補完が向上し、DBテーブル構造を常に確認する必要がなくなります。
  • Doctrineは、実際のテーブルフィールド名から完全に抽象化します。エンティティプロパティをDBフィールドにマッピングすると、どこでもプロパティ名を使用します。テーブル名についても同じです。
  • Doctrineは、エンティティの取得の詳細を隠すリポジトリパターンを使用します。
  • Doctrineは「コードファースト」アプローチを利用しているため、最初にエンティティを作成してから、それらのデータベースを自動的に生成できます。逆の場合も可能です。
  • Doctrineには強力なクエリビルダーがあるため、条件付きパーツを使用したクエリにビルダーパターンを利用できます。
  • Doctrineは、外部キーと制約を使用してカスケードアクションを実行し、データの一貫性を維持します。
  • DoctrineのUnitOfWorkは非常に優れたスマートなものであり、他のphpORMには類似点がありません。

現時点でのIMHOの教義は、利用可能なすべてのphpORMの中で最高のIDEコード補完サポートとDBレイヤー抽象化を提供します。過剰に設計されておらず、SOLIDの原則に従います。

于 2014-08-21T13:48:16.727 に答える
0

GerKirillの答えにポイントを付け加えたいと思います。マジックゲッター/セッターメソッドのサポートがないことは弱点であり、私見ではありません。同一のゲッター/セッターの数十ページをスクロールしたことがある場合、これらのメソッドは(コンパイル時間は言うまでもなく)スペースの膨大な浪費であることに気付くでしょう。誰も誤ってオブジェクト変数を設定することはなく、セッターはそれを妨げることはありません...プロパティを変更したい場合は、セッターを呼び出すだけです(セッターはどのようにプロパティを「保護」しますか?タイプミスをして間違ったプロパティ値を直接設定すると、同じタイプミスをして間違ったセッターを呼び出すことになります)。また、セッターまたはゲッターがプロパティを取得または設定する以外のことを行うことは非常にまれです。プロパティを設定または取得するために何か特別なことをする必要がある場合は、http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html)、またはコードをリファクタリングするか、プロパティ検証関数を呼び出す必要があります(通常はオブジェクトが作成された時間)。これは、OOの世界を悩ませている挑戦されていない真実の1つです。標準の受信した知識の返信を投稿する前に、それについて考えてください。

于 2018-02-21T18:17:51.960 に答える