• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
What mom never told you about bundle configurations - Symfony Live Paris 2012
 

What mom never told you about bundle configurations - Symfony Live Paris 2012

on

  • 9,582 views

 

Statistics

Views

Total Views
9,582
Views on SlideShare
6,571
Embed Views
3,011

Actions

Likes
12
Downloads
0
Comments
3

32 Embeds 3,011

http://symfonybrasil.blogspot.com.br 1962
http://www.symfony.es 642
http://www.elao.com 155
https://twitter.com 55
http://feeds.feedburner.com 36
http://www.mybestcv2.co.il 34
http://symfonybrasil.blogspot.ru 26
http://symfonybrasil.blogspot.com 24
http://symfonybrasil.blogspot.pt 22
http://protalk.me 7
http://www.sfexception.com 5
http://webcache.googleusercontent.com 5
http://symfonybrasil.blogspot.com.es 5
http://symfonybrasil.blogspot.co.nz 4
http://symfonybrasil.blogspot.de 3
http://symfonybrasil.blogspot.co.uk 3
http://us-w1.rockmelt.com 3
http://symfonybrasil.blogspot.jp 3
http://tweetedtimes.com 3
http://translate.googleusercontent.com 2
http://www.symfonybrasil.blogspot.com.br 1
http://symfonybrasil.blogspot.mx 1
http://symfonybrasil.blogspot.ae 1
http://172.16.32.13 1
http://symfonybrasil.blogspot.ca 1
http://symfonybrasil.blogspot.no 1
http://symfonybrasil.blogspot.ch 1
http://twitter.com 1
https://si0.twimg.com 1
http://symfony.es 1
http://www.php-talks.com 1
http://symfonybrasil.blogspot.it 1
More...

Accessibility

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

13 of 3 previous next Post a comment

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    What mom never told you about bundle configurations - Symfony Live Paris 2012 What mom never told you about bundle configurations - Symfony Live Paris 2012 Presentation Transcript

    • I love myhttp://www.flickr.com/photos/slushpup/3055613967/
    • Dennis Benkert Software Developer Coding Consulting Coaching Symfony User Groups Symfony Day Cologne
    • What mom never told you about Bundle configurations
    • parameters: global.page_size: 10 gloabl.page_num: 5 global.tracking.key: Correct type? ASFDIPSADPFIHwer234123QSD # Various configuration webservices.timeout: 100 content_check.enabled: true birthdates.start: 1950 # TODO: Delete after release logging.registrations: true # Tracking Bundle Configuration trackingbundle.user: rebum Only this bundle?! trackingbundle.api.version: 1_0 trackingbundle.use_ssl: true # Do not touch this!!! trackingbundle.track_super_users: false infobundle.god_mode: true # Ticket 123456234 infobundle.level: 42 # Connection data for some service some_webservice.url: http://example.com some_webservice.user: api Multiple connections?! some_webservice.key: Sdfihwef $5sdf” SAFAWEF some_webservice.ssl: true
    • my_project_tracking: user: rebum api_version: 1_0 use_ssl: true # Do not touch this!!! track_super_users: falsemy_project_info: god_mode: true # Ticket 123456234 level: 42my_project_ webservice: connection: url: http://example.com user: api key: Sdfihwef $5sdf” SAFAWEF ssl: trueparameters: global.page_size: 10 gloabl.page_num: 5 global.tracking.key: ASFDIPSADPFIHwer234123QSD # ...
    • Bad configuration Worse than bad code
    • Bad validation Even worse
    • Config Component http://www.flickr.com/photos/capcase/2735500813/
    • Cache Locate ConfigValidate Load
    • Cache Locate ConfigValidate Load
    • Locate & Load http://www.flickr.com/photos/onthespiral/3406281939/
    • $locator = new FileLocator( __DIR__./../Resources/config); Path(s) of resources
    • Available in path(s)?$locator->locate(config.xml);
    • // src/YourBundle/DependencyInjection/// YourBundleExtension.php Special Loader for DIC$loader = new LoaderXmlFileLoader( $container, new FileLocator(...)); Path(s) of resources
    • Load configuration in DIC$loader->load(services.xml);
    • $loader->load(services.xml);$loader->load(other_services.xml);
    • Cache Locate ConfigValidate Load
    • Validatehttp://www.flickr.com/photos/jeremybrooks/3214838875/
    • your_bundle: enabled: true
    • // src/YourBundle/DependencyInjection/// YourBundleExtension.phppublic function load($configs, /*...*/){ // processing and unprocessed Matched ... if (true === $config[enabled]) { $loader->load(services.xml); } Processed and validated}
    • your_bundle: enabled: true Validate Convertarray(enabled => true);
    • Build a Config Tree http://www.flickr.com/photos/jlscha/6226656013/
    • // src/YourBundle/DependencyInjection/// Configuration.php The config treepublic function getConfigTreeBuilder(){ $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder ->root(your_bundle); // tree definition ... Your root node return $treeBuilder;}
    • your_bundle: enabled: true
    • $rootNode Node type Node name ->children() ->booleanNode(enabled) ->defaultFalse() ->end() ->end() More options;
    • ScalarBoolean Array Node
    • ScalarBoolean Array Node
    • ->booleanNode(enabled)->end()
    • your_bundle: enabled: troo
    • Type validation
    • ScalarBoolean Array Node
    • your_bundle: timeout: 60
    • All scalar types->scalarNode(timeout) ->defaultValue(3600) ->isRequired() ->cannotBeEmpty()->end() Validation options
    • your_bundle: timeout: sixty seconds
    • ->scalarNode(timeout) Custom validation // ... Validation logic ->validate() ->ifTrue(function ($v) { return !is_int($v); }) ->thenInvalid(No integer) ->end()->end() Custom error
    • Custom error
    • ScalarBoolean Array Node
    • connection: url: http://example.com user: api key: $ome35ecre7Ke$
    • Group of nodes->arrayNode(connection) ->children() Specific validation ->scalarNode(url) ->isRequired() ->end() ->scalarNode(user)->end() ->scalarNode(key)->end() ->end()->end()
    • array(connection => array( url => http://example.com, user => api, key => $ome35ecre7Ke$ ));
    • connections: default: url: http://example.com user: api key: $ome35ecre7Ke$ fallback: url: http://back.example.com user: fallback_api key: $ome35ecre7Ke$
    • ->arrayNode(connections)Prototype variations ->useAttributeAsKey(name) ->prototype(array) ->children() Key generation ->scalarNode(url) ->isRequired() ->end() ->scalarNode(user)->end() ->scalarNode(key)->end() ->end() validation Prototype ->end() ->requiresAtLeastOneElement()->end()
    • array ( connections => array ( default => array ( url => ..., user => api, key => $ome35ecre7Ke$ ), fallback => array ( url => ..., user => fallback_api, key => $ome35ecre7Ke$ )));
    • Build upon structure http://www.flickr.com/photos/victornuno/222145881/
    • // src/YourBundle/DependencyInjection/// YourBundleExtension.phppublic function load(/*...*/) Load services{ if (true === $config[enabled]) { $loader->load(services.xml); }}
    • public function load(/*...*/){ if (true === $config[enabled]) { $loader->load(services.xml); } Split services if (true === $config[add_extras]) { $loader->load(extras.xml); }}
    • Manipulate DIC$container->setParameter( your_bundle.timeout, $config[timeout]);
    • Testing Configuration http://www.flickr.com/photos/sidelong/246816211/
    • Get DIC$container =Extension Register your $this->createContainer();$container->registerExtension( Extension Load your new YourBundleExtension());$container->loadFromExtension( Process configuration array()); your_bundle,$this->compileContainer($container);
    • $this->assertTrue( $container->getParameter(enabled));
    • /** Custom error * @expectedException Exception * @expectedMessage No integer */public function testConfiguration(){}
    • Let‘s recaphttp://www.flickr.com/photos/tine72/5464869042/
    • Configurationneeds structure
    • Configurationneeds validation
    • Configurationneeds conversion
    • Config Component is awesome