phpsymfonysymfony-dependency-injection

The > "Symfony\Component\DependencyInjection\ContainerInterface" autowiring > alias is deprecated. How eliminate it on symfony 5.1?


I am migrating an application from Symfony 4.4 to Symfony 5.4. In the case of forms, I have a form that I pass in the constructor a variable ContainerInterface $container to use a parameter in the configuration of a widget. In version 5.4 this gives me a deprecation warning:

Since symfony/dependency-injection 5.1: The "Symfony\Component\DependencyInjection\ContainerInterface" autowiring alias is deprecated. Define it explicitly in your app if you want to keep using it. It is being referenced by the "App\Form\BuscarAvanzadaNinhoType" service.

How do I solve it?

class BuscarAvanzadaNinhoType extends AbstractType {

    private $em;
    private $security;
    private $uuidEncoder;
    private $container;

    public function __construct(ManagerRegistry $em, Security $security, UuidEncoder $uuidEncoder, ContainerInterface $container) {
        $this->em = $em;
        $this->security = $security;
        $this->uuidEncoder = $uuidEncoder;
        $this->container = $container;
    }

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
               
                ->add('otrosAspectos', Select2EntityType::class, array(
                    'class' => EtiquetaAspectoNinho::class,
                    'remote_route' => 'ninhos_encontrarEtiquetaAspectos',
                    'primary_key' => 'id',
                    'text_property' => 'text',
                    'multiple' => true,
                    'allow_clear' => false,
                    'delay' => 250,
                    'cache' => false,
                    'minimum_input_length' => 3,
                    'scroll' => true,
                    'page_limit' => $this->container->getParameter('limite_resultados_etiquetas'),
                    'language' => 'es',
                    'width' => '100%',
                    'placeholder' => '',
                        )
        );

        
    }

    

}

Solution

  • You can pass parameters directly without the container.

    public function __construct(ManagerRegistry $em, Security $security, UuidEncoder $uuidEncoder, array $formParams) {
        $this->em = $em;
        $this->security = $security;
        $this->uuidEncoder = $uuidEncoder;
        $this->formParams = $formParams;
    }
    

    services.yml

    services:
        _defaults:
            autowire: true
            autoconfigure: true
            bind:
                $formParams:
                    limite_resultados_etiquetas: '%limite_resultados_etiquetas%'
    

    In the form:

    'page_limit' => $this->formParams['limite_resultados_etiquetas'],