61

リポジトリに関するドキュメントを読むときは、エンティティとコレクションを操作することがよくありますが、「読み取り専用」の方法で作業します。

insertUser(User $user)リポジトリにまたはのようなメソッドがある例はありませんupdateUser(User $user)

ただし、SOAを使用する場合、ServiceはEntity Managerと連携してはなりません(そうですよね?)。

  1. 私のサービスはグローバルEntityManagerを認識している必要がありますか?
  2. 私のサービスが使用済みのリポジトリ(たとえば、UserRepositoryとArticleRepository)についてのみ知っている必要があります

その両方の質問から、別の質問ですが、私のサービスは明示的に、そして私のエンティティはこれまでにすべきpersist()でしょflush()うか?

4

3 に答える 3

48

はい、通常、リポジトリはクエリのみに使用されます。

これが私のやり方です。サービス層は永続性を管理します。コントローラー レイヤーはサービス レイヤーを認識していますが、モデル オブジェクトがどのように永続化されているか、またそれらがどこから来ているかについては何も知りません。コントローラー レイヤーが気にするのは、サービス レイヤーにオブジェクトを保持して返すように要求することです。それが実際にどのように行われるかは気にしません。

サービス レイヤー自体は、永続レイヤー (エンティティまたはドキュメント マネージャー、リポジトリなど) について知るのに最適です。

わかりやすくするためのコードを次に示します。

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);
    }
}
于 2011-12-03T19:42:50.567 に答える
2

では、entityManager を使用しない場合、どのようにリポジトリを取得しますか? 結局のところ、エンティティはデータベースへの接続がなければ魔法のように保存されるわけではないため、サービスは何らかの形であらゆる種類の接続を認識している必要があります。

$_em->getRepository()->save($entity)SOA サービスについてはわかりませんが、私の目には、またはを使用してもまったく違いはありません$_em->persist($entity)。一方、リポジトリでフラッシュを使用すると、リポジトリがビジネス ロジックを認識するようになったため、必要以上のクエリが発生する可能性があります。

これを「SOAの方法」で行う方法があると思いますが、リポジトリ内のエンティティを永続化していないと思います。

于 2011-12-03T19:42:22.967 に答える