【问题标题】:__construct() must be an instance of Doctrine\Common\Persistance\ObjectManager__construct() 必须是 Doctrine\Common\Persistance\ObjectManager 的一个实例
【发布时间】:2018-01-22 12:25:06
【问题描述】:

我使用 Objectmanger 来使用 Doctrine .. 我创建了 objectManager 的实例并创建了服务,但是我有这个错误:

可捕获的致命错误:传递给 Tag\TagBundle\Form\Types\TagsType::__construct() 的参数 1 必须是 Doctrine\Common\Persistance\ObjectManager 的实例,给定的 Doctrine\ORM\EntityManager 实例,在 / 中调用var/www/html/TagProject/var/cache/dev/appDevDebugProjectContainer.php 在第 2412 行并定义

代码标签类型:

<?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;
        }

    }

代码标签转换器:

<?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%"]

【问题讨论】:

  • 这有点令人费解。可能会尝试流行的缓存清除。如果您注入实体管理器的唯一原因是将其传递给转换器,那么您可能会考虑将转换器定义为服务并注入它。但同样,我经常使用 ObjectManager 作为类型提示,它对我有用。
  • 我终于开始在一个干净的 S33 应用程序上进行测试,而 ObjectManager 对我来说仍然可以正常工作。我认为您的错误消息可能来自其他地方。

标签: symfony


【解决方案1】:

您正在注入EntityManager 的实例,因此您应该使用相应的接口Doctrine\ORM\EntityManagerInterface 进行类型提示。

use Doctrine\ORM\EntityManagerInterface;

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

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

【讨论】:

  • 但据我所知,EntityManagerInterface 扩展了ObjectManager 接口
  • 我知道 ObjectManager 类型提示通常可以正常工作,并且它可以轻松地将注入的管理器切换到 Doctrine/ODM/DocumentManager 实例(除了玩与MongoDB有关)......但问题似乎与某种形式的延迟加载/代理类有关,在这种情况下,显然注入的对象没有实现ObjectManager......所以我决定寻求一个快速的解决方案确实解决了这个问题:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2021-04-22
  • 2017-04-06
  • 2019-07-13
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多