如何注入非默认实体经理



在symfony2中您可以与多个实体经理一起使用,并使用以下代码之类的内容:

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

我们可以通过以下方式将默认管理器注入任何服务:

"@doctrine.orm.entity_manager"

如何将非默认实体经理注入服务?

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

对于那些使用Symfony 3 的人,使用控制台: php bin/console debug:container

然后,您应该看到许多线以:'doctrine.my.my_custom_entity_manager_xxxxxxxxxx'

因此,如果您希望实体管理器与您的自定义Entity Manager相对应,请找到该行:'doctrine.orm.my_custom_entity_manager_entity_manager'

您可以将其插入您的服务参数。

希望它有帮助。

您应该将自定义Entity Manager定义为服务:

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

你好,首先创建您的经理,在我的示例中,我为我的corebundle中的项目类创建经理:

<?php
// src/Sybio/Bundle/CoreBundle/Manager/ItemManager.php:
namespace SybioBundleCoreBundleManager;
use SybioBundleCoreBundleEntityItem;
class ItemManager
{
    /**
     * @var DoctrineORMEntityManager $em entity manager
     */
    protected $em;
    /**
     * @var DoctrineORMEntityRepository $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: SybioBundleCoreBundleManagerItemManager
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 = "SybioBundleCoreBundleEntity\".$entityName[1];
    return new $entityName;
}

相关内容

  • 没有找到相关文章

最新更新