2016-09-20 62 views
0

开始时,我使用了存储库。如何用Symfony2创建ObjectManager服务?

但是,在github上的一些代码评论后,我很有趣地使用ObjectManager(以减轻控制器,并且好奇心^^)。

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

在FriendsOfSymfony github中,我们可以看到一个例子,但我并不真正了解如何初始化服务。我有这样的错误“无法实例接口主义\ COMMON \持久性\的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> 

在此先感谢您的帮助

回答

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有一看,可以帮助你。