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" to the service __construct.
My question is, how to inject everything that is under parameters in the service?
I need this in order to make a navigation manager service, where different menus / navigations / breadcrumbs are to be generated according to different settings through all of the configuration entries.
I know I could inject as many parameters as I want, but since it is going to use a number of them and is going to expand as time goes, I think its better to pass the whole thing right in the beginning.
Other approach might be if I could get the parameters inside the service as you can do in a controller $this -> container -> getParameter('some.key');, but I think this would be against the idea of Dependency Injection?
Thanks in advance!
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' 
                        Another variant how to get parameters easy - you can just set ParameterBag to your service. You can do it in different ways - via arguments or via set methods. Let me show my example with set method.
So in services.yml you should add something like:
my_service:     class: MyService\Class     calls:         - [setParameterBag, ["@=service('kernel').getContainer().getParameterBag()"]]   and in class MyService\Class just add use:
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;   and create 2 methods:
/**                                                                                                                                                                        * Set ParameterBag for repository                                                                                                                                         *                                                                                                                                                                         * @param ParameterBagInterface $params                                                                                                                                    */ public function setParameterBag(ParameterBagInterface $params) {     $this->parameterBag = $params; }  /**                                                                                                                                                                        * Get parameter from ParameterBag                                                                                                                                         *                                                                                                                                                                         * @param string $name                                                                                                                                                     * @return mixed                                                                                                                                                          */ public function getParameter($name) {     return $this->parameterBag->get($name); }   and now you can use in class:
$this->getParameter('your_parameter_name'); 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With