Являются ли репозитории Doctrine2 хорошим местом для спасения моих сущностей?
-
27-10-2019 - |
Вопрос
Когда я читаю документы о репозиториях, часто бывает работать с объектами и коллекцией, но в «только для чтения».
Никогда не бывает примеров, когда у репозитории есть такие методы, как insertUser(User $user)
или же updateUser(User $user)
.
Однако при использовании SOA обслуживание не должно работать с менеджером объектов (это верно, не так ли?) Итак:
- Должен ли моя служба знать о Global EntityManager?
- Если моя служба узнает только об использованных репозиториях (допустим, пользовательпозиция и articleRepository)
Из этого оба вопроса, другой, если моя служба когда -либо явно 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 ,
Утверждается, что репозитории использует «подобный коллекции интерфейс».
Позже, также написано «объекты могут быть добавлены и удалены из репозитория, как они могут из простой коллекции объектов».
Я не говорю, что это Библия, но концептуально нет ничего плохого в том, чтобы увидеть хранилище, подобное коллекции, которую вы можете запросить. Но поскольку это коллекция, вы можете добавить, удалить, ... фактически, objectrepository должен реализовать доктрину common collection :)
С другой стороны, наиболее важным является то, чтобы не испортить чтения и пишет, как говорит CQS. Возможно, поэтому они не допустили этого, чтобы избежать злоупотреблений и читать/писать микс.
РЕДАКТИРОВАТЬ: Я должен был поговорить о flush
. Анкет Это должно нет быть сделанным в самом репозитории, так как он может нарушить транзакционную последовательность.
Тебе лучше переместить flush
Позвоните в то, что завершает всю логику бизнес -транзакции (командный автобус управляется командой Fe?)
Ну, как вы получите свой репозиторий, не используя EntityManager? В конце концов, объекты не будут сохранены магически без подключения к базе данных, поэтому ваша служба должна быть каким -то образом знать о каком -либо подключении.
Я не знаю о службах SOA, но в моих глазах это вообще не имеет значения, если вы используете $_em->getRepository()->save($entity)
или же $_em->persist($entity)
. Анкет С другой стороны, если вы используете Flush в своем хранилище, вы можете получить гораздо больше запросов, чем необходимо, поскольку ваш репозиторий теперь знает о бизнес -логике.
Я думаю, что есть способ сделать это «Путь SOA», но я думаю, что это не сохраняет сущности в репозитории.