リポジトリに関するドキュメントを読むと、エンティティとコレクションを「読み取り専用」で操作することがよくあります。
insertUser(User $user)
リポジトリにや のようなメソッドがある例はありませんupdateUser(User $user)
。
ただし、SOA を使用する場合、サービスは Entity Manager と連携して動作してはいけません (そうですよね)。そのため、次のようになります。
- サービスはグローバル EntityManager を認識する必要がありますか?
- 私のサービスは、使用されているリポジトリ(UserRepository と ArticleRepository など)についてのみ認識する必要がありますか?
両方の質問から、もう 1 つは、私のサービスpersist()
とflush()
私のエンティティを明示的に指定する必要があるかどうかです。
ベストアンサー1
はい、リポジトリは通常、クエリにのみ使用されます。
これが私のやり方です。サービス層永続性を管理します。コントローラ層はサービス層を認識していますが、モデル オブジェクトがどのように永続化されるか、またどこから来るかについては何も認識していません。コントローラ層が気にするのは、サービス層にオブジェクトを永続化して返すように要求することであり、実際にどのように行われるかは気にしません。
サービス層自体は、永続層(エンティティまたはドキュメント マネージャー、リポジトリなど)について知るのに最適です。
わかりやすくするために、次のコードを示します。
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);
}
}