Symfony2: How to inject ALL parameters in a service?

后端 未结 7 851
既然无缘
既然无缘 2020-12-28 14:14

How can I inject ALL parameters in a service?

I know I can do: arguments: [%some.key%] which will pass the parameters: some.key: \"value\"

7条回答
  •  执笔经年
    2020-12-28 14:48

    It is not a good practice to inject the entire Container into a service. Also if you have many parameters that you need for your service it is not nice to inject all of them one by one to your service. Instead I use this method:

    1) In config.yml I define the parameters that I need for my service like this:

     parameters:
        product.shoppingServiceParams:
            parameter1: 'Some data'
            parameter2: 'some data'
            parameter3: 'some data'
            parameter4: 'some data'
            parameter5: 'some data'
            parameter6: 'some data'
    

    2) Then I inject this root parameter to my service like:

    services:
      product.shoppingService:
        class: Saman\ProductBundle\Service\Shopping
        arguments: [@translator.default, %product.shoppingServiceParams%]
    

    3) In may service I can access these parameters like:

    namespace Saman\ProductBundle\Service;
    
    use Symfony\Bundle\FrameworkBundle\Translation\Translator;
    
    class Shopping
    {   
        protected $translator;
        protected $parameters;
    
        public function __construct(
            Translator $translator, 
            $parameters
            ) 
        {
            $this->translator = $translator;
            $this->parameters = $parameters;
        }
    
        public function dummyFunction()
        {
            var_dump($this->getParameter('parameter2'));
        }
    
        private function getParameter($key, $default = null)
        {
            if (isset($this->parameters[$key])) {
                return $this->parameters[$key];
            }
    
            return $default;
        }  
    }
    

    4) I can also set different values for different environments. For example in config_dev.yml

     parameters:
        product.shoppingServiceParams:
            parameter1: 'Some data for dev'
            parameter2: 'some data for dev'
            parameter3: 'some data for dev'
            parameter4: 'some data for dev'
            parameter5: 'some data for dev'
            parameter6: 'some data'
    

提交回复
热议问题