はい、通常、リポジトリはクエリのみに使用されます。
これが私のやり方です。サービス層は永続性を管理します。コントローラー レイヤーはサービス レイヤーを認識していますが、モデル オブジェクトがどのように永続化されているか、またそれらがどこから来ているかについては何も知りません。コントローラー レイヤーが気にするのは、サービス レイヤーにオブジェクトを保持して返すように要求することです。それが実際にどのように行われるかは気にしません。
サービス レイヤー自体は、永続レイヤー (エンティティまたはドキュメント マネージャー、リポジトリなど) について知るのに最適です。
わかりやすくするためのコードを次に示します。
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);
}
}