如何注入非默认实体管理器?

14

在Symfony2中,您可以使用多个实体管理器,并使用以下类似代码:

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

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

我们可以使用以下方法将默认管理器注入到任何服务中:

"@doctrine.orm.entity_manager"
如何将非默认实体管理器注入服务?
4个回答

29

如果你的实体管理器配置名称是non_default,那么你可以将其引用为@doctrine.orm.non_default_entity_manager


只是为了确保,需要将其创建为服务,对吗? - d0001
1
Symfony会自动创建服务,因此您无需手动创建。连接也是如此。 - Mun Mun Das
2
另外,您可以使用“php app/console container:debug”命令来验证它。 - Mun Mun Das
2
是的,它能够工作,并且比我的解决方案更好 - 因此,如果在stackoverflow上更改已接受的答案是可能的,那么应该接受这个答案。最好的祝福! - Cyprian
其他解决方案也可以,但除非我们需要手动定义服务,否则这个更好。 - d0001

5

对于使用Symfony 3+的用户,请使用控制台:

php bin/console debug:container

然后你会看到很多以'doctrine.orm.MY_CUSTOM_ENTITY_MANAGER_xxxxxxxxxx'开头的代码行。

如果你想要与自定义实体管理器对应的实体管理器,请查找此行:

'doctrine.orm.MY_CUSTOM_ENTITY_MANAGER_entity_manager'

然后,将其插入到服务参数中即可。

希望这能帮到您。


4

您应该将自定义实体管理器定义为服务:

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版本而异(它可以是getEntityManagergetManager)。


1
首先,创建您的管理器。在我的例子中,我为位于CoreBundle中的Item类创建了管理器:
<?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!然后在您的Bundle的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;
}

你难道没有使用'@doctrine.orm.entity_manage'注入默认的实体管理器吗? - d0001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接