Symfony 4. How to access the service from controller without dependency injection?

后端 未结 3 456
庸人自扰
庸人自扰 2020-12-18 16:07

I have several services: DieselCaseService, CarloanCaseService LvCaseService.

The controller decides which of services to get.

$type = $quickCheck[\         


        
3条回答
  •  春和景丽
    2020-12-18 16:36

    For any "multiple instances of same type by key" situation, you can use autowired array.

    1. Autodiscovery Services with App\ namespace

    services:
        _defaults:
            autowire: true
    
        App\:
            resource: ../src
    

    2. Require autowired array in Constructor

    cases[$case->getName()] = $cases;
            }
        }
    
        public function someAction(): void
        {
            $dieselCase = $this->cases['diesel']; // @todo maybe add validation for exisiting key
            $dieselCase->anyMethod();
        }
    }
    

    3. Register compiler pass in Kernel

    The autowired array functionality is not in Symfony core. It's possible thanks to compiler passes. You can write your own or use this one:

    use Symplify\PackageBuilder\DependencyInjection\CompilerPass\AutowireArrayParameterCompilerPass;
    
    final class AppKernel extends Kernel
    {
        protected function build(ContainerBuilder $containerBuilder): void
        {
            $containerBuilder->addCompilerPass(new AutowireArrayParameterCompilerPass);
        }
    }
    

    That's it! :)

    I use it on all my projects and it works like a charm.


    Read more in post about autowired arrays I wrote.

提交回复
热议问题