Autowire似乎无法正常工作

时间:2018-05-07 12:23:13

标签: forms symfony symfony-3.4

[问题]

我在使用Symfony 3.4,我现在处理服务的方式有些问题。即使它正在工作,我也不得不使用旧方法,这是一个问题。

我在表单上使用DataTransformer但由于某些原因,我收到以下错误

  

类型错误:参数1传递给AppBundle \ Form \ VarianteEscalierOptGc \ VarianteEscalierOptGcEditPoteauType :: __ construct()必须是AppBundle \ Form \ DataTransformer \ VarianteEscalierTransformer的实例,没有给出

如文档中所述:

  

就是这样!只要您使用autowire和autoconfigure,Symfony就会自动知道将TaskT的一个实例传递给TaskType。

这是我的情况,但仍然有错误。

此外,如果有人可以提示我如何正确更新下面的服务,那就太棒了。

[FILES]

FormType

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('varianteEscalier', HiddenType::class, array('data'=>$options['data']->getVarianteEscalier()->getId()))
            ->add('gardecorpsOption', EntityType::class, array(
                'class'=>'AppBundle:GardecorpsOption',
                'query_builder'=>function(EntityRepository $er) {
                    return $er->createQueryBuilder("gco")
                              ->where("gco.type='poteau'")
                              ->andWhere("gco.actif=1");
                },
            ))
            ->add('quantite');
    $builder->get('varianteEscalier')->addModelTransformer($this->transformer);
}

Transformer.php

class VarianteEscalierTransformer implements DataTransformerInterface {
    private $em;

    /**
     * @param EntityManagerInterface $em
     */
    public function __construct(EntityManagerInterface $em) {
        $this->em=$em;
    }

    /**
     * @param  Object|null $entity
     * @return string
     */
    public function transform($entity) {
        if(null === $entity) {
            return "";
        }

        return $entity->getId();
    }

    /**
     * @param $entityId
     * @return VarianteEscalier|null
     */
    public function reverseTransform($entityId) {
        if(!$entityId) {
            return null;
        }
        $entity=$this->em->getRepository(VarianteEscalier::class)->findOneBy(array('id'=>$entityId));
        if($entity === null) {
            throw new TransformationFailedException(sprintf('VarianteEScalier avec l\'id '.$entityId.' n\'existe pas!'));
        }

        /** @noinspection PhpIncompatibleReturnTypeInspection */
        return $entity;
    }
}

services.yml

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false
    listener.projet:
        class: AppBundle\Listener\ProjetListener
        arguments: ['@security.token_storage']
        tags:
            - { name: doctrine.orm.entity_listener, lazy: true }
    listener.variante:
        class: AppBundle\Listener\VarianteListener
        tags:
            - { name: doctrine.orm.entity_listener, lazy: true }
    service.upload:
        public: true
        class: AppBundle\Service\UploadService
        arguments:
            $dirPicto: '%dir_picto%'

1 个答案:

答案 0 :(得分:1)

您缺少服务发现部分,因此_default之后您忘记了

_defaults:
  ...

  App\: #You might need to change this to the correct namespace
    resource: '../src/*'

看看https://symfony.com/doc/current/service_container/3.3-di-changes.html#step-4-auto-registering-services