Являются ли репозитории Doctrine2 хорошим местом для спасения моих сущностей?

StackOverflow https://stackoverflow.com/questions/8369956

Вопрос

Когда я читаю документы о репозиториях, часто бывает работать с объектами и коллекцией, но в «только для чтения».

Никогда не бывает примеров, когда у репозитории есть такие методы, как insertUser(User $user) или же updateUser(User $user).

Однако при использовании SOA обслуживание не должно работать с менеджером объектов (это верно, не так ли?) Итак:

  1. Должен ли моя служба знать о Global EntityManager?
  2. Если моя служба узнает только об использованных репозиториях (допустим, пользовательпозиция и 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», но я думаю, что это не сохраняет сущности в репозитории.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top