4

I am looking into using Doctrine2 with my Zend Framework setup. I really like the datamapper pattern, mainly because it seperates my domain models with my database.

My question is what is the best practice for using Doctrine and DQL with my controllers?

  1. controllers uses Doctrine DQL/EntityManager directly for saving/loading my domain models?

  2. create my own classes in the datamapper pattern for saving/loading my domain models, and then use Doctrine internally in my own classes?

The pros. for #1 is of course that I don't need to create my own datamapper models, but again, with #2 I can later replace Doctrine (in theory)

What would you do?

4

5 に答える 5

3

抽象化に関する質問については、このプロジェクトの存続期間と、コードの移植性が必要かどうかに大きく依存すると思います。最小限のメンテナンスしか必要としない 1 回限りの Web サイトの場合は、追加の抽象化レイヤーを省略してコントローラーに Doctrine コードを記述するだけで時間を節約できるでしょう。ただし、このコードを再利用したり、別のプラットフォームに移動したり、長期間維持したりする予定がある場合は、時間をかけてその抽象化を追加すると、柔軟性が大幅に向上します。

まだフレームワークを研究している場合は、Kohanaをご覧ください。これは基本的に、PHP5 用に書かれた CodeIgniter を軽量に書き直したものです。

于 2009-09-24T16:47:16.660 に答える
2

pix0r からのアドバイスに賛成です。追加の抽象化は、それが潜在的に長い寿命を持つ大規模なプロジェクトであり、おそらく多くの開発者が参加している場合にのみ価値があります。これは、doctrine2 を使用した php であろうと、jpa を使用した Java であろうと、私が従うガイドラインとほとんど同じです (doctrine2 は jpa に非常に似ているため)。

追加の抽象化が必要な場合、doctrine2 にはリポジトリを使用する可能性が既に含まれています (リポジトリは DAO と非常に似ているか、同等であり、ビジネス用語とロジックに重点が置かれている可能性があります)。基本クラス Doctrine\ORM\EntityRepository があります。EntityManager#getRepository($entityName) を呼び出すたびに、Doctrine はそのエンティティのカスタム リポジトリ クラスを構成したかどうかを調べます。そうでない場合は、Doctrine\ORM\EntityRepository をインスタンス化します。docblock アノテーションなど、メタデータ内のエンティティのカスタム リポジトリ クラスを構成できます: @Entity(..., repositoryClass="My\Project\Domain\UserRepository")。このようなカスタム クラスは、EntityRepository から継承し、親コンストラクターを適切に呼び出す必要があります。基本クラスには、いくつかの基本的な find* 機能が既に含まれています。

ローマン

于 2009-09-27T08:30:46.040 に答える
1

私の考えは、pix0r の応答に似ています。ただし、プロジェクトが小さすぎてコントローラーで直接 EntityManager/DQL を使用できる場合、Doctrine 2 はプロジェクトにとってやり過ぎである可能性があり、より小さくシンプルなシステムを検討する必要があります。

于 2010-11-01T00:26:49.383 に答える
1

研究では Symfony も検討してください。ORM(propel/doctrine) を使用したり、独自のデータ モデルを記述したりできます。必要に応じて、データ関係をバイパスしてダイレクト SQL を使用することもできます。

1 または 2 に関するあなたの懸念に対処するために、私は個人的にプロジェクトで ORM を使用し、必要に応じてそれをバイパスします。さらに良いことに、symfony では、必要に応じて doctrine と propel または独自のクラスを切り替えることができます。

Pros:
1) faster development. easier to maintain. generally more secure and consistent. easy to switch databases should you ever need to.(from MySQL to Oracle, etc). 

2) Faster runtime. Less dependency.

Cons:
1) Slower runtime and larger memory footprint. Dependency on other projects.
2) (reverse the pros for #1) 
于 2009-09-24T16:35:55.420 に答える