Как внедрить менеджеров сущностей не по умолчанию?

В Symfony2 вы можете работать с несколькими менеджерами сущностей и использовать что-то вроде кода ниже:

$em = $this->get('doctrine')->getManager();
$em = $this->get('doctrine')->getManager('default');

$customerEm =  $this->get('doctrine')->getManager('customer');

Мы можем внедрить менеджер по умолчанию в любой сервис, используя:

"@doctrine.orm.entity_manager"

Как вы можете внедрить менеджеров не по умолчанию в сервисы?

Ответы на вопрос(4)

php bin/console debug:container

Тогда вы должны увидеть много строк, начинающихся с: 'doctrine.orm.MY_CUSTOM_ENTITY_MANAGER_xxxxxxxxxx»

Поэтому, если вы хотите, чтобы менеджер сущностей соответствовал вашему настраиваемому менеджеру сущностей, найдите строку: 'doctrine.orm.MY_CUSTOM_ENTITY_MANAGER_entity_manager»

Вы можете вставить его в свои служебные аргументы.

Надеюсь, поможет.

прежде всего, создайте свой менеджер, в моем примере я создаю менеджер для своего класса Item, который находится в CoreBundle:

<!--?php
// src/Sybio/Bundle/CoreBundle/Manager/ItemManager.php:

namespace Sybio\Bundle\CoreBundle\Manager;

use Sybio\Bundle\CoreBundle\Entity\Item;

class ItemManager
{
    /**
     * @var \Doctrine\ORM\EntityManager $em entity manager
     */
    protected $em;

    /**
     * @var \Doctrine\ORM\EntityRepository $em repository
     */
    protected $repository;

    /**
     * @var string $entityName
     */
    protected $entityName;

    /**
     * Constructor
     *
     * @param EntityManager $em
     * @param string $entityName
     * 
     * @return void
     */
    public function __construct(EntityManager $em, $entityName)
    {
        $this--->em = $em;
        $this->repository = $em->getRepository($entityName);
        $this->entityName = $entityName;
    }

    /**
     * Save a entity object
     *
     * @param Object $entity
     * 
     * @return Object Entity
     */
    public function save($entity)
    {
        $this->persistAndFlush($entity);

        return $entity;
    }

    /**
     * Remove a entity object
     *
     * @param Object $entity
     * 
     * @return Object Entity
     */
    public function remove($entity)
    {
        return $this->removeAndFlush($entity);
    }

    /**
     * Persist object
     *
     * @param mixed $entity
     * 
     * @return void
     */
    protected function persistAndFlush($entity)
    {
        $this->em->persist($entity);
        $this->em->flush();
    }

    /**
     * Remove object
     *
     * @param mixed $entity entity to remove
     * 
     * @return void
     */
    protected function removeAndFlush($entity)
    {
        $this->em->remove($entity);
        $this->em->flush();
    }

    /**
     * Returns entity repository object
     * 
     * @return EntityRepository
     */
    public function getRepository()
    {
        return $this->repository;
    }

    /**
     * Create a new object
     * 
     * @return mixed
     */
    public function createNewObject()
    {
        return new Item();
    }

    // Create your own methods to manage the object

}

Если структура менеджера разделена между несколькими менеджерами, вы можете создать BaseManager, расширенный всеми остальными менеджерами!

Затем зарегистрируйте его в файле services.yml (или xml) вашего пакета:

# src/Sybio/Bundle/CoreBundle/Resources/config/services.yml or xml !:

parameters:

    # Managers _________________

    sybio.item_manager.entity: SybioCoreBundle:Item
    sybio.item_manager.class: Sybio\Bundle\CoreBundle\Manager\ItemManager

services:

    # Managers _________________

    sybio.item_manager:
        class:        %sybio.item_manager.class%
        arguments:    [@doctrine.orm.entity_manager, %sybio.item_manager.entity%]

Тот'Теперь вы можете использовать это:

// Controller:

$im =  $this->get('sybio.item_manager');

$item = $im->createNewObject();
$im->save($item);

Затем вы можете улучшить свой менеджер, здесь я даю массив параметров конфигурации для моего менеджера:

# src/Sybio/Bundle/CoreBundle/Resources/config/services.yml or xml !:

sybio.item_manager:
        class:        %sybio.item_manager.class%
        arguments:    [@doctrine.orm.entity_manager, %sybio.item_manager.entity%, {'item_removed_state': %item_removed_state%, 'item_unpublished_state': %item_unpublished_state%, 'item_published_state': %item_published_state%}]


// src/Sybio/Bundle/CoreBundle/Manager/ItemManager.php:

public function __construct(EntityManager $em, $entityName, $params = array()) {
    // ...
    $this->params = $params;
}

Если вы создаете BaseManager, вы также можете создать полезный универсальный метод для инициализации объекта:

// src/Sybio/Bundle/CoreBundle/Manager/BaseManager.php:

/**
 * Create a new object
 * 
 * @return mixed
 */
public function createNewObject()
{
    $entityName = explode(":", $this->entityName);
    $entityName = "Sybio\Bundle\CoreBundle\Entity\\".$entityName[1];

    return new $entityName;
}
 d000129 окт. 2012 г., 22:26
Арен»т вы вводите менеджер сущности по умолчанию с '@ Doctrine.orm.entity_manage?

services:  
    name_of_your_custom_manager:
        class: %doctrine.orm.entity_manager.class%
        factory_service:  doctrine
        factory_method:   getEntityManager
        arguments: ["name_of_your_custom_manager"]

Затем вы можете ввести его так же, как вы делаете это с каждым сервисом:

@name_of_your_custom_manager

Редактировать:

Обратите внимание, что фабричный метод может отличаться от Symfonyверсия S (это может бытьgetEntityManager или же )getManager

Решение Вопроса

non_default тогда вы можете сослаться на это как@doctrine.orm.non_default_entity_manager

 Mun Mun Das29 окт. 2012 г., 22:33
Не нужно создавать сервис. Symfony автоматически создаст его. То же самое относится и к соединениям.
 Mun Mun Das29 окт. 2012 г., 22:35
Также вы можете оформитьphp app/console container:debug Команда, чтобы проверить это.
 Cyprian30 окт. 2012 г., 11:10
Да, это'работает и этолучшее решение, чем мое - так что, если онос помощью stackoverflow возможно изменить принятый ответ, этот должен быть принят. Лучший!
 d000129 окт. 2012 г., 22:23
Просто чтобы быть уверенным, необходимо создать его как сервисное право.
 d000131 окт. 2012 г., 04:24
Другие решения тоже работают, но это лучше, если по какой-то причине нам не нужно определять сервис вручную.

Ваш ответ на вопрос