2017-08-14 28 views
0

我用Objectmanger的使用原则。我创建的ObjectManager的实例,并创建服务,但我有这样的错误:__construct()必须学说 COMMON 持久性实例的ObjectManager

Catchable Fatal Error: Argument 1 passed to Tag\TagBundle\Form\Types\TagsType::__construct() must be an instance of Doctrine\Common\Persistance\ObjectManager, instance of Doctrine\ORM\EntityManager given, called in /var/www/html/TagProject/var/cache/dev/appDevDebugProjectContainer.php on line 2412 and defined

代码TagsType :

<?php 

    namespace Tag\TagBundle\Form\Types; 

    use Symfony\Component\Form\AbstractType; 
    use Symfony\Component\Form\Extension\Core\Type\TextType; 
    use Tag\TagBundle\Form\DataTransformer\TagsTransformer; 
    use Symfony\Bridge\Doctrine\Form\DataTransformer\CollectionToArrayTransformer; 
    use Symfony\Component\Form\FormBuilderInterface; 
    use Doctrine\Common\Persistance\ObjectManager; 

    class TagsType extends AbstractType { 

    /** 
    * @var ObjectManager 
    */ 

    private $manager; 

    public function __construct(ObjectManager $manager){ 
     $this->manager = $manager; 
    } 

     public function buildForm(FormBuilderInterface $builder, array $options){ 
      $builder 
        ->addModelTransformer(new CollectionToArrayTransformer(),true) 
        ->addModelTransformer(new TagsTransformer($this->manager),true); 
     } 

     public function getParent(){ 
      return TextType::class; 
     } 

    } 

代码TagsTransformer:

<?php 

      namespace Tag\TagBundle\Form\DataTransformer; 

      use Symfony\Component\Form\DataTransformerInterface; 
      use Tag\TagBundle\Entity\Tag; 
      use Doctrine\Common\Persistance\ObjectManager; 

      class TagsTransformer implements DataTransformerInterface { 


      /** 
      * @var ObjectManager 
      */ 

      private $manager; 

      public function __construct(ObjectManager $manager){ 
       $this->manager = $manager; 
      } 

      public function transform($value) { 
       dump($value); 
       return implode(',',$value); 
      } 

       public function reverseTransform($string) 
       { 
        $names = explode(',',$string); 
        $tags = $this->manager->getRepository('TagBundle:Tag')->findBy(['name' => $names]); 
        $newNames = array_diff($names, $tags); 
        foreach($names as $name){ 
         $tag = new tag(); 
         $tag->setName($name); 
         $tags[] = $tag; 
        } 
        return $tags; 
       } 
      } 

代码services.yml:

services: 
    tag.form.types.tages: 
    class: Tag\TagBundle\Form\Types\TagsType 
    arguments: ["@doctrine.orm.entity_manager"] 
    tags: 
     - { name: form.type } 
# tag.example: 
#  class: Tag\TagBundle\Example 
#  arguments: ["@service_id", "plain_value", "%parameter%"] 
+0

这有点令人费解。可能会尝试一直流行的缓存清理。如果您注入实体经理的唯一原因是将其传递给变压器,那么您可以考虑将变压器定义为服务并注入它。但是,我经常使用ObjectManager作为类型提示,它对我很有用。 – Cerad

+0

我终于开始在一个干净的S33应用程序上进行测试,而ObjectManager仍然适用于我。我认为你的错误信息可能来自其他地方。 – Cerad

回答

0

你注射的EntityManager一个实例,所以你应该使用相应的接口Doctrine\ORM\EntityManagerInterface为typehinting。

use Doctrine\ORM\EntityManagerInterface; 

class TagsTransformer implements DataTransformerInterface 
{ 
    /** 
    * @var EntityManagerInterface 
    */ 
    private $manager; 

    public function __construct(EntityManagerInterface $manager) 
    { 
     $this->manager = $manager; 
    } 
+0

但是据我所见,'EntityManagerInterface'扩展了'ObjectManager'接口 –

+0

我知道'ObjectManager' typehint通常工作正常,并且它允许将注入的管理器轻松切换到'Doctrine/ODM /例如DocumentManager'实例(可能没有人玩过MongoDB除外)......但是这个问题似乎与某种形式的lazy-loading/proxy类有关,在这种情况下,注入的对象显然没有实现ObjectManager '...所以我决定去找一个能够解决问题的快速解决方案:-) – nifr

相关问题