Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Inside the Symfony DIC and Config

Inside the Symfony DIC and Config

Slides for my Symfony workshop at PHPBenelux 2013

Andreas Hucks

January 25, 2013
Tweet

More Decks by Andreas Hucks

Other Decks in Programming

Transcript

  1. class  Logger   {    public  function  log($message,  $level  =

     'INFO')    {      $formatter  =  new  XmlFormatter();        $log  =  $formatter-­‐>format(        $message,        $level      );        $this-­‐>writeLog($log);    }   }  
  2. class  Logger   {    function  __construct(FormatterInterface  $formatter)    {

         $this-­‐>formatter  =  $formatter;    }      [...]   }  
  3. class  Logger   {    [...]      public  function

     log($message,  $level  =  'INFO')    {      $log  =  $this-­‐>formatter-­‐>format(        $message,        $level      );        $this-­‐>writeLog($log);    }   }  
  4. class  Logger   {    [...]      function  setFormatter(FormatterInterface

     $formatter)    {      $this-­‐>formatter  =  $formatter;    }      [...]   }  
  5. “Dependency Injection is where components are given their dependencies through

    their constructors, methods, or directly into fields.”
  6. interface  ExchangeRatesInterface   {          /**  

             *  @return  array            */          public  function  getRates();            /**            *  @param  string  $currency            *  @return  float            */          public  function  getRate($currency);   }  
  7.   interface  AdapterInterface   {          /**

               *  @return  string            */          public  function  getRawData();   }  
  8.   interface  ParserInterface   {          /**

               *  @param  string  $rawData            *  @return  array            */          public  function  parse($rawData);   }  
  9. argument A parameter given by the DIC to a service,

    via the constructor or a mutator method (setter).
  10. <service  id="sensio.logger"  class="Sensio\Logger"  >            <!-­‐-­‐

     Constructor  arguments  -­‐-­‐>          <argument>/path/to/app/logs/app.log</argument>          <argument  type="service"                                               id="sensio.logger.xml_formatter"  />              <!-­‐-­‐  Methods  to  call  -­‐-­‐>          <call  method="setDefaultSeverity">                  <argument>DEBUG</argument>          </call>      <!-­‐-­‐  Tags  -­‐-­‐>            <tag  name="tools.logger"  />         </service>  
  11. <service  id="sensio.logger"  class="Sensio\Logger"  >            <!-­‐-­‐

     Constructor  arguments  -­‐-­‐>          <argument>/path/to/app/logs/app.log</argument>          <argument  type="service"                                               id="sensio.logger.xml_formatter"  />              <!-­‐-­‐  Methods  to  call  -­‐-­‐>          <call  method="setDefaultSeverity">                  <argument>DEBUG</argument>          </call>      <!-­‐-­‐  Tags  -­‐-­‐>            <tag  name="tools.logger"  />         </service>  
  12. <service  id="sensio.logger"  class="Sensio\Logger"  >            <!-­‐-­‐

     Constructor  arguments  -­‐-­‐>          <argument>/path/to/app/logs/app.log</argument>          <argument  type="service"                                               id="sensio.logger.xml_formatter"  />              <!-­‐-­‐  Methods  to  call  -­‐-­‐>          <call  method="setDefaultSeverity">                  <argument>DEBUG</argument>          </call>      <!-­‐-­‐  Tags  -­‐-­‐>            <tag  name="tools.logger"  />         </service>  
  13. <service  id="sensio.logger"  class="Sensio\Logger"  >            <!-­‐-­‐

     Constructor  arguments  -­‐-­‐>          <argument>/path/to/app/logs/app.log</argument>          <argument  type="service"                                               id="sensio.logger.xml_formatter"  />              <!-­‐-­‐  Methods  to  call  -­‐-­‐>          <call  method="setDefaultSeverity">                  <argument>DEBUG</argument>          </call>      <!-­‐-­‐  Tags  -­‐-­‐>            <tag  name="tools.logger"  />         </service>  
  14. public  function  load(      array  $configs,      ContainerBuilder

     $container   )   {    $configuration  =  new  Configuration();    $config  =  $this      -­‐>processConfiguration($configuration,  $configs);      $loader  =  new  Loader\XmlFileLoader(      $container,      new  FileLocator(__DIR__.'/../Resources/config')    );      $loader-­‐>load('exchangerates.xml');   }  
  15. Array  (          [0]  =>  Array  (

                     [exchange_rates]  =>  Array  (                          [curl]  =>  Array  (                                  [CURLOPT_TIMEOUT]  =>  5                          )                  )          )          [1]  =>  Array  (                  [exchange_rates]  =>  Array  (                          [curl]  =>  Array  (                                  [CURLOPT_TIMEOUT]  =>  10,                                  [CURLOPT_PROXY]  =>  http:// localhost:8888                          )                  )          )   )  
  16. Array  (          [exchange_rates]  =>  Array  (

                     [curl]  =>  Array  (                          [CURLOPT_TIMEOUT]  =>  10                          [CURLOPT_PROXY]  =>  http://localhost:8888                  )                  [endpoint]  =>  http://www.ecb.europa.eu/stats...          )   )  
  17. class  Configuration  implements  ConfigurationInterface   {    public  function  getConfigTreeBuilder()

       {      $treeBuilder  =  new  TreeBuilder();      $rootNode  =  $treeBuilder>root('acme_dic_workshop');        $rootNode        -­‐>children()          -­‐>scalarNode('some_config_var')            -­‐>isRequired()            -­‐>defaultValue('foo')            -­‐>end()          -­‐>end();        return  $treeBuilder;    }   }  
  18. -­‐>scalarNode(‘some_url')    -­‐>isRequired()    -­‐>cannotBeEmpty()    -­‐>validate()      -­‐>ifTrue(function($value)

     {        return  !filter_var($value,  \FILTER_VALIDATE_URL);    })      -­‐>thenInvalid('Not  a  valid  url.')    -­‐>end()   -­‐>end()