Doctrine2リポジトリは私のエンティティを救うのに良い場所ですか?
-
27-10-2019 - |
質問
リポジトリに関するドキュメントを読むとき、多くの場合、エンティティとコレクションを操作するが、「読み取り専用」の方法で作業することです。
リポジトリには次のような方法がある例はありません insertUser(User $user)
また updateUser(User $user)
.
ただし、SOAを使用する場合、サービスはエンティティマネージャーと協力してはいけません(そうですね)。
- 私のサービスは、グローバルなentityManagerに注意する必要がありますか?
- 私のサービスは、使用済みのリポジトリのみを知っている必要があります(Userrepository&Articlerepositoryなど)
その両方の質問から、もう1つは、私のサービスが明示的にあるべきです persist()
& flush()
私のエンティティ?
解決
はい、リポジトリは通常、クエリのみに使用されます。
これが私がそれをする方法です。 サービスレイヤー 持続性を管理します。コントローラーレイヤーはサービスレイヤーを知っていますが、モデルオブジェクトがどのように持続するか、どこから来たのかについては何も知りません。コントローラーレイヤーが気にしているのは、サービスレイヤーにオブジェクトを持続して返すように求めているためです。実際にどのように行われるかは気にしません。
サービスレイヤー自体は、永続性レイヤー:エンティティまたはドキュメントマネージャー、リポジトリなどについて知るのに完全に適しています。
これを明確にするためのコードを次に示します。
class UserController
{
public function indexAction()
{
$users = $this->get('user.service')->findAll();
// ...
}
public function createAction()
{
// ...
$user = new User();
// fill the user object here
$this->get('user.service')->create($user);
// ...
}
}
class UserService
{
const ENTITY_NAME = 'UserBundle:User';
private $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function findAll()
{
return $this->em->getRepository(self::ENTITY_NAME)->findAll();
}
public function create(User $user)
{
// possibly validation here
$this->em->persist($user);
$this->em->flush($user);
}
}
他のヒント
リポジトリパターンをご覧ください http://martinfowler.com/eaacatalog/repository.html ,
リポジトリは「コレクションのようなインターフェイス」を使用していると述べられています。
後で、「オブジェクトに追加され、オブジェクトの単純なコレクションからできる限り、リポジトリから削除できる」と書かれています。
私はこれが聖書だと言っているわけではありませんが、あなたがクエリできるコレクションのようなリポジトリを見ることは概念的には何の問題もありません。しかし、それはコレクションであるため、追加、削除することができます。
一方、最も重要なのは、CQSが言うように、読み物や書くことを台無しにしないことです。それが、虐待を避けてミックスを読み取るために、彼らが直接それを許可しなかった理由かもしれません。
編集:私は話すべきだった flush
. 。これはすべきです いいえ トランザクションの一貫性を破る可能性があるため、リポジトリ自体で作成されます。
動かした方がいいでしょう flush
ビジネストランザクションロジック全体をラップするもの(コマンドを処理するコマンドバスFE?)を呼び出します。
さて、EntityManagerを使用していない場合、どのようにリポジトリを入手できますか?結局のところ、エンティティはデータベースへの接続なしに魔法のように保存されることはないため、サービスは何らかの形であらゆる種類の接続に注意する必要があります。
SOAサービスについては知りませんが、私の目には、あなたが使用してもまったく違いはありません $_em->getRepository()->save($entity)
また $_em->persist($entity)
. 。一方、リポジトリでFlushを使用すると、リポジトリがビジネスロジックを認識しているため、必要以上に多くのクエリになる可能性があります。
これを行う方法は「SOA Way」を行う方法があると思いますが、リポジトリ内のエンティティを維持していないと思います。