如何使用Symfony2创建ObjectManager服务?

时间:2016-09-20 10:01:32

标签: symfony service

一开始,我使用了存储库。

但是,在github上进行一些代码审查之后,我很有兴趣使用ObjectManager(以减轻控制器,以及好奇心^^)。

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

在FriendsOfSymfony github中,我们可以看到一个例子,但我真的不明白如何初始化服务。当我初始化我的经理服务时,我有这个错误“无法实例化接口Doctrine \ Common \ Persistence \ ObjectManager”:

<?xml version="1.0" ?>

http://symfony.com/schema/dic/services/services-1.0.xsd“&GT;

<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>

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

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,它可能对您有帮助。

相关问题