【问题标题】:How to create ObjectManager service with Symfony2?如何使用 Symfony2 创建 ObjectManager 服务?
【发布时间】:2016-09-20 10:01:31
【问题描述】:

一开始,我使用的是存储库。

但是,在 github 上进行了一些代码审查之后,我对使用 ObjectManager 很感兴趣(以减轻控制器的负担,也出于好奇 ^^)。

问题是我没有看到一些关于它的好教程。甚至我看到的教程都是通过对象管理器初始化服务,而不是创建服务。

在 FriendsOfSymfony github 中,我们可以看到一个示例,但我不太了解如何初始化服务。当我像这样初始化我的管理器服务时,出现此错误“无法实例化接口 Doctrine\Common\Persistence\ObjectManager”:

<?xml version="1.0" ?>

http://symfony.com/schema/dic/services/services-1.0.xsd">

<parameters>
    <parameter key="md_mechanical.entity.enginemanager.class">MD\MechanicalBundle\Entity\EngineManager</parameter>
</parameters>

<services>
    <service id="md_mechanical.enginemanager.default" class="%md_mechanical.entity.enginemanager.class%">
        <argument type="service" id="md_mechanical.object_manager" />
        <argument>%md_engine.engine.class%</argument>
    </service>

    <!-- The factory is configured in the DI extension class to support more Symfony versions -->
    <service id="md_mechanical.object_manager" class="Doctrine\Common\Persistence\ObjectManager">
        <argument>%fos_user.model_manager_name%</argument>
    </service>
</services>

提前感谢您的帮助

【问题讨论】:

    标签: symfony service


    【解决方案1】:

    Cannot instantiate interface Doctrine\Common\Persistence\ObjectManager 表示您正在尝试实例化一个接口,这是不可能的。

    您必须创建一个实现此接口的对象,并定义所有功能

    use Doctrine\Common\Persistence\ObjectManager as ObjectManager;
    
    class MyObjectManager implements ObjectManager
    {
        public function __construct(/* some params here */)
        {
            // Construct your manager here
        }
    
        public function find($className, $id)
        {
            // Do stuff
        }
    
        public function persist($object)
        {
            // Do stuff
        }
    
        public function remove($object)
        {
            // Do stuff
        }
    
        public function merge($object)
        {
            // Do stuff
        }
    
        public function clear($objectName = null)
        {
            // Do stuff
        }
    
        public function detach($object)
        {
            // Do stuff
        }
    
        public function refresh($object)
        {
            // Do stuff
        }
    
        public function flush()
        {
            // Do stuff
        }
    
        public function getRepository($className)
        {
            // Do stuff
        }
    
        public function getClassMetadata($className)
        {
            // Do stuff
        }
    
        public function getMetadataFactory()
        {
            // Do stuff
        }
    
        public function initializeObject($obj)
        {
            // Do stuff
        }
    
        public function contains($object)
        {
            // Do stuff
        }
    }
    

    然后将其声明为服务

    <services>
        <service id="myObjectManager" class="%myObjectManager.class%">
            <argument>...</argument>
        </service>
    
        # Use your brand new object manager
        <service id="md_mechanical.enginemanager.default" class="%md_mechanical.entity.enginemanager.class%">
            <argument type="service" id="myObjectManager" />
            <argument>%md_engine.engine.class%</argument>
        </service>
    </services>
    

    你应该看看Doctrine\ORM\EntityManagerDoctrine\ORM\EntityManagerInterface,它可能对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      相关资源
      最近更新 更多