【发布时间】: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