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

E9612cd342dbddff6640b99db21deee7?s=128

Andreas Hucks

January 25, 2013
Tweet

Transcript

  1. None
  2. Symfony DIC and Configuration

  3. Andreas Hucks @meandmymonkey Senior Developer, Trainer, Consultant SensioLabs Deutschland

  4. The Project:

  5. http://goo.gl/rS06X

  6. Life without Dependency Injection

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

     'INFO')    {      $formatter  =  new  XmlFormatter();        $log  =  $formatter-­‐>format(        $message,        $level      );        $this-­‐>writeLog($log);    }   }  
  8. Problems?

  9. class  Logger   {    function  __construct(FormatterInterface  $formatter)    {

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

     log($message,  $level  =  'INFO')    {      $log  =  $this-­‐>formatter-­‐>format(        $message,        $level      );        $this-­‐>writeLog($log);    }   }  
  11. Alternative: Setter Injection

  12. class  Logger   {    [...]      function  setFormatter(FormatterInterface

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

    their constructors, methods, or directly into fields.”
  14. Interfacing with the Webservice

  15. interface  ExchangeRatesInterface   {          /**  

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

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

               *  @param  string  $rawData            *  @return  array            */          public  function  parse($rawData);   }  
  18. Task Implement class ExchangeRates using MockAdapter and XmlParser. Generate output

    using ExchangeRatesCommand .
  19. The Service Container

  20. The Service Container is simply a PHP object that manages

    the instantiation of services.
  21. $container-­‐>get('logger');       $container-­‐>getParameter('logger.class');    

  22. Vocabulary Elements

  23. service An object managed by the Dependency Injection Container.

  24. argument A parameter given by the DIC to a service,

    via the constructor or a mutator method (setter).
  25. parameter A configuration value.

  26. <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>  
  27. Vocabulary Attributes

  28. id The service identifier or name

  29. class The service class to instantiate

  30. alias An alias name for this service

  31. public Set to false to make the service private and

    used internally
  32. <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>  
  33. Vocabulary Service Elements

  34. argument An argument to pass to a method (constructor or

    setter)
  35. call A method to call on the newly created object

  36. tag A tag to attach to the service definition

  37. <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>  
  38. Vocabulary Argument Attributes

  39. type Define the nature of the argument. Allowed values: string,

    constant, collection or service
  40. id The service name, if the argument is a service

  41. key The argument key when dealing with the collection type

  42. <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>  
  43. http://goo.gl/FNJ9H

  44. Task Write a container configuration!

  45. Configuration

  46. 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');   }  
  47. 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                          )                  )          )   )  
  48. Array  (          [exchange_rates]  =>  Array  (

                     [curl]  =>  Array  (                          [CURLOPT_TIMEOUT]  =>  10                          [CURLOPT_PROXY]  =>  http://localhost:8888                  )                  [endpoint]  =>  http://www.ecb.europa.eu/stats...          )   )  
  49. 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;    }   }  
  50. -­‐>scalarNode(‘some_url')    -­‐>isRequired()    -­‐>cannotBeEmpty()    -­‐>validate()      -­‐>ifTrue(function($value)

     {        return  !filter_var($value,  \FILTER_VALIDATE_URL);    })      -­‐>thenInvalid('Not  a  valid  url.')    -­‐>end()   -­‐>end()  
  51. http://goo.gl/8sa6Q

  52. Thanks! https://joind.in/7778