Components
                                Symfony’s secret weapon




                                                          Javier López | @loalf

domingo 27 de noviembre de 11
The components




domingo 27 de noviembre de 11
The components are a set of standalone,
               decoupled and cohesive PHP libraries that solve
               common web development problems.




domingo 27 de noviembre de 11
21 Components

                                Browserkit     EventDispatcher         Security


                                ClassLoader        Routing          HttpFoundation


                                  Finder      DependencyInjection       Config


                                 Console         CssSelector           Locale


                                   Form          DomCrawler           HttpKernel


                                 Serializer        Process           Templating


                                   Yaml            Validator         Translation




domingo 27 de noviembre de 11
21 Components

                                Browserkit     EventDispatcher         Security


                                ClassLoader        Routing          HttpFoundation


                                  Finder      DependencyInjection       Config


                                 Console         CssSelector           Locale


                                   Form          DomCrawler           HttpKernel


                                 Serializer        Process           Templating


                                   Yaml            Validator         Translation




domingo 27 de noviembre de 11
Installing




domingo 27 de noviembre de 11
mkdir ComponentPlayground
                          cd ComponentPlayground
                          mkdir vendor
                          cd vendor
                          git clone https://github.com/symfony/symfony




domingo 27 de noviembre de 11
download




domingo 27 de noviembre de 11
autoload.php
           <?php

           require_once __DIR__.'/vendor/symfony/src/Symfony/Component/
           ClassLoader/UniversalClassLoader.php';

           use SymfonyComponentClassLoaderUniversalClassLoader;

           $loader = new UniversalClassLoader();
           $loader->registerNamespaces(array(
             'Symfony'       => __DIR__.'/vendor/symfony/src',
           ));

           $loader->register();




domingo 27 de noviembre de 11
sample.php

           <?php

           require_once 'autoload.php';

           /*
             * Sample code
             */




         > php sample.php




domingo 27 de noviembre de 11
Yaml




domingo 27 de noviembre de 11
Parsing and generating YAML files




domingo 27 de noviembre de 11
parsing YAML files

                                           use SymfonyComponentYamlYaml;
         #example.yml
                                           $data = Yaml::parse('example.yml');
         description: “Users of Symfony”
         users:                            print $data['description'];
           javi:
             name: “Javi”                  foreach( $data['users'] as $user)
             surname: “López”              {
          rob:                               print $user['name']
             name: “Rob”                           .' '.
             surname: “Waring”                     $user['surname'];
                                           }




domingo 27 de noviembre de 11
generating YAML files

       use SymfonyComponentYamlYaml;

       $data['description'] = "Symfony Users”

       $data['users'][] = array(                    description: “Symfony users”
          'name'    => 'Javi',                      users:
          'surname' => 'Lopez'                        0:
       );                                                name: “Javi”
                                                         surname: “López”
       $data['users'][] = array(                     1:
          'name'    => 'Rob',                            name: “Rob”
          'surname' => 'Waring'                          surname: “Waring”
       );

       print Yaml::dump($data);




domingo 27 de noviembre de 11
YAML & PHP

        #example.yml

        generated: <?php echo date(‘Y’); ?>   use SymfonyComponentYamlYaml;
        description: “Users of Symfony”
        users:                                Yaml::enablePhpParsing();
          javi:
            name: “Javi”                      $data = Yaml::parse('example.yml');
            surname: “López”
         rob:                                 print $data['generated'];
            name: “Rob”
            surname: “Waring”




domingo 27 de noviembre de 11
Finder




domingo 27 de noviembre de 11
Finding files and directories the easy way




domingo 27 de noviembre de 11
finding by name


            use SymfonyComponentFinderFinder;


            $files = Finder::create()
                                ->name("*.php")
                                ->name("*.{php,yml}")
                                ->name("/.(php|yml)$/")
                                ->name("/^w{3,10}$/")
                                ->name("foo.php")
                                ->in(__DIR__);




         Referencia sobre Patrones Glob: http://cowburn.info/2010/04/30/glob-patterns/



domingo 27 de noviembre de 11
finding by size

            use SymfonyComponentFinderFinder;


            $files = Finder::create()
                                ->size("> 10k")
                                ->size("<= 4mi")
                                ->size("2gi")
                                ->in(__DIR__);


                                                   k = 1000     ki = 1024
                                                   m = 1000^2   mi = 1024^2
                                                   g = 1000^3   gi = 1024^3




domingo 27 de noviembre de 11
finding by date


            use SymfonyComponentFinderFinder;


            $files = Finder::create()
                                ->date("since yesterday")
                                ->date("until 2 days ago")
                                ->date("> now - 2 hours")
                                ->date(">= 2005-10-15 ")
                                ->in(__DIR__);




         Every parameter valid to strtotime()



domingo 27 de noviembre de 11
fixing the depth


            use SymfonyComponentFinderFinder;


            $files = Finder::create()
                                ->depth(0)
                                ->depth(>1)
                                ->depth(<3)
                                ->in(__DIR__);




domingo 27 de noviembre de 11
just files



            use SymfonyComponentFinderFinder;


            $files = Finder::create()
                                ->files()
                                ->in(__DIR__);




domingo 27 de noviembre de 11
just directories



            use SymfonyComponentFinderFinder;


            $files = Finder::create()
                                ->directories()
                                ->in(__DIR__);




domingo 27 de noviembre de 11
sorting

            use SymfonyComponentFinderFinder;


            $files = Finder::create()
                                ->sortByName()
                                ->sortByType()
                                ->sort(
                                    function(SplFileInfo $file1, SplFileInfo $file2){
                                      return $file1->getSize() > $file2->getSize();
                                    }
                                  )
                                ->in(__DIR__);




domingo 27 de noviembre de 11
php files in the project root directory


            use SymfonyComponentFinderFinder;


            $files = Finder::create()
                                ->files()
                                ->depth(0)
                                ->name("*.php")
                                ->in(__DIR__);




domingo 27 de noviembre de 11
images in Amazon S3


            $s3 = new Zend_Service_Amazon_S3($key, $secret);
            $s3->registerStreamWrapper("s3");


            $files = Finder::create()
                                ->name('*.{jpg,jpeg,png,gif}')
                                ->size('< 100K')
                                ->date('since 1 hour ago')
                                ->in('s3://bucket-name');




domingo 27 de noviembre de 11
Process




domingo 27 de noviembre de 11
Easening command system execution




domingo 27 de noviembre de 11
Is Twitter online?

            use SymfonyComponentProcessProcess;


            $process = new Process('ping -c 1 twitter.com');
            $process->run();


            if($process->isSuccessful()){
              print "Twitter is online";
            }else{
                 print "Twitter is offline";
            }




domingo 27 de noviembre de 11
ping -c 4 twitter.com




domingo 27 de noviembre de 11
showing the average time
            $process = new Process('ping -c 4 twitter.com');
            $process->run();


            if($process->isSuccessful())
            {
                 $output = $process->getOutput();


                 $pattern = '/time=(d+.d+) ms/';
                 preg_match_all($pattern, $output, $matches);
                 $average = array_sum($matches[1])/count($matches[1]);


                 printf("Avergage time=%.3f ms", $average);
            }else{
                 print "Twitter is offline";
            }

domingo 27 de noviembre de 11
showing just the time

            use SymfonyComponentProcessProcess;


            $process = new Process('ping -c 4 twitter.com');
            $process->run(function($type, $buffer) {
                 if('out' === $type){
                     $pattern = '/time=(d+.d+) ms/';
                     if(preg_match_all($pattern, $buffer, $matches)){;
                         print $matches[0][0]."n";
                     }
                 }elseif( 'err' === $type ){
                     print "Twitter is offline";
                 }
            });



domingo 27 de noviembre de 11
DomCrawler




domingo 27 de noviembre de 11
extracting information from the DOM




domingo 27 de noviembre de 11
Twitter search


          use SymfonyComponentDomCrawlerCrawler;


          $uri                  = 'http://search.twitter.com/search.atom?q=symfony2';
          $crawler = new Crawler();
          $content = file_get_contents($uri);
          $crawler->addXmlContent($content);


          foreach($crawler->filterXpath('//content') as $node)
          {
               print $node->nodeValue;
          }




domingo 27 de noviembre de 11
Symfony.com blog posts

          use SymfonyComponentDomCrawlerCrawler;


          $uri                  = 'http://symfony.com/blog';
          $content = file_get_contents($uri);


          $crawler = new Crawler($content, $uri);


          $nodes = $crawler->filterXPath('//div[@class="box_article"]//a');
          foreach($nodes->links() as $link)
          {
               print $link->getUri();
          }




domingo 27 de noviembre de 11
CssSelector




domingo 27 de noviembre de 11
CSS Selector => XPath expressions




domingo 27 de noviembre de 11
from CSS to XPath



          use SymfonyComponentCssSelectorCssSelector;

          print CssSelector::toXPath('div.box_article a');

          /*
           * descendant-or-self::div[
             *       contains(
             *         concat(' ', normalize-   space(@class), ' '),
             *         ' box_article '
             *    )
             * ]/descendant::a
             */




domingo 27 de noviembre de 11
Symfony.com blog posts


          use SymfonyComponentDomCrawlerCrawler;

          $uri     = 'http://symfony.com/blog';
          $content = file_get_contents($uri);

          $crawler = new Crawler($content, $uri);

          $nodes = $crawler->filter('div.box_article a');




domingo 27 de noviembre de 11
Templating




domingo 27 de noviembre de 11
A simple and easy template engine




domingo 27 de noviembre de 11
4 words




domingo 27 de noviembre de 11
Loader: finds a template




domingo 27 de noviembre de 11
NameParser: converts templates name to templates objects




domingo 27 de noviembre de 11
Engine: renders templates




domingo 27 de noviembre de 11
Helpers: adds extra functionality




domingo 27 de noviembre de 11
A simple example




          // __DIR__/templates/index.php


          <?php echo $name; ?>




domingo 27 de noviembre de 11
A simple example

          use SymfonyComponentTemplatingLoaderFilesystemLoader;
          use SymfonyComponentTemplatingPhpEngine;
          use SymfonyComponentTemplatingTemplateNameParser;


          $loader = new FilesystemLoader(
                                     array(__DIR__.'/templates/%name%.php')
                                );
          $parser = new TemplateNameParser();
          $engine = new PhpEngine($parser, $loader);


          echo $engine->render('index', array('name' => 'Javi'));




domingo 27 de noviembre de 11
Inheritance
          // __DIR__/templates/layout.php


          <div id="header">
               <h1>Cabecera</h1>
          </div>
          <div id="content">
               <?php echo $view['slots']->get('_content'); ?>
          </div>
          <div id="footer">
               <p>Pie</p>
          </div>




domingo 27 de noviembre de 11
Inheritance


          // __DIR__/templates/index.php


          <?php echo $view->extend('layout'); ?>


          <p>
          <?php echo $name; ?>
          </p>




domingo 27 de noviembre de 11
Inheritance


          use SymfonyComponentTemplatingHelperSlotsHelper;


          $loader = new FilesystemLoader(
                                     array(__DIR__.'/templates/%name%.php')
                                );
          $parser = new TemplateNameParser();
          $engine = new PhpEngine($parser, $loader, new SlotsHelper());


          echo $engine->render('index', array('name' => 'Javi'));




domingo 27 de noviembre de 11
Inheritance


          <div id="header">
               <h1>Cabecera</h1>
          </div>
          <div id="content">
                      <p>Javi</p>
          </div>
          <div id="footer">
                      <p>Pie</p>
          </div>




domingo 27 de noviembre de 11
and many more ...

                                ... slots
                                ... global variables
                                ... escaping
                                ... assets managment
                                ... cache




domingo 27 de noviembre de 11
Validator




domingo 27 de noviembre de 11
asserting variable or object values




domingo 27 de noviembre de 11
Validating a value is not null



          use SymfonyComponentValidatorConstraintsNotNull;
          use SymfonyComponentValidatorConstraintsNotNullValidator;


          $validator = new NotNullValidator();
          if(!$validator->isValid(null, new NotNull()))
          {
               print $validator->getMessageTemplate();
               // "The value should not be null"
          }




domingo 27 de noviembre de 11
24 Validators
                                 Blank          Max          Date


                                NotBlank        Min          Time


                                  Null          Url        DateTime


                                NotNull        Email        Locale


                                  True           IP        Language


                                 False          File        Country


                                Choice         Image       Collection


                                 Type           Size       Callback



domingo 27 de noviembre de 11
Using the Validator service
          use SymfonyComponentValidatorValidator;
          use SymfonyComponentValidatorConstraintValidatorFactory;
          use SymfonyComponentValidatorMappingBlackholeMetadataFactory;
          use SymfonyComponentValidatorConstraints as Asserts;


          $validator = new Validator(
                             new BlackholeMetadataFactory,
                                           new ConstraintValidatorFactory
          );


          $errors = $validator->validateValue('', new AssertsNotBlank());
          if($errors->count())
          {
               print $errors;
          }
                                ConstraintViolationList



domingo 27 de noviembre de 11
Validando un objeto (PHP)


          class Person
          {
               public $name;
               public $age;
          }




          $name must not be empty
          $age must be a number between 18 and 99




domingo 27 de noviembre de 11
Validating an object (PHP)

          use SymfonyComponentValidatorValidator;
          use SymfonyComponentValidatorConstraintValidatorFactory;
          use SymfonyComponentValidatorMappingClassMetadataFactory;
          use SymfonyComponentValidatorMappingLoaderStaticMethodLoader;


          $validator = new Validator(
            new ClassMetadataFactory(new StaticMethodLoader() ),
               new ConstraintValidatorFactory()
          );


          $person = new Person();
          $errors = $validator->validate($person);




domingo 27 de noviembre de 11
Validating an object (PHP)
          use SymfonyComponentValidatorMappingClassMetadata;
          use SymfonyComponentValidatorConstraint as Asserts;


          class Person
          {
               public $name;
               public $age;


               static function loadValidatorMetadata(ClassMetadata $metadata)
               {
                   $metadata
                     ->addPropertyConstraint('name', new AssertsNotBlank())
                       ->addPropertyConstraint('age' , new AssertsMin(18));
                       ->addPropertyConstraint('age' , new AssertsMax(99));
               }
          }


domingo 27 de noviembre de 11
Validando un objeto (YAML)


          class Person
          {
               public $name;
               public $age;
          }




          $name must not be empty
          $age must be a number between 18 and 99




domingo 27 de noviembre de 11
Validating an object (YAML)


          # validate.yml


          Person:
               properties:
                   name:
                     - NotBlank : ~
                   age:
                       - Min: 18
                       - Max: 99




domingo 27 de noviembre de 11
Validating an object (YAML)

          use SymfonyComponentValidatorValidator;
          use SymfonyComponentValidatorConstraintValidatorFactory;
          use SymfonyComponentValidatorMappingClassMetadataFactory;
          use SymfonyComponentValidatorMappingLoaderYamlFileLoader;


          $validator = new Validator(
            new ClassMetadataFactory(
                    new YamlFileLoader(__DIR__.'/validate.yml')
               ),
               new ConstraintValidatorFactory()
          );


          $person = new Person();
          $errors = $validator->validate($person);




domingo 27 de noviembre de 11
Console




domingo 27 de noviembre de 11
Creating repetive tasks




domingo 27 de noviembre de 11
The easiest console ever



          // console.php


          use SymfonyComponentConsoleApplication;


          $console = new Application();
          $console->run();




domingo 27 de noviembre de 11
php console.php




domingo 27 de noviembre de 11
php console.php help




domingo 27 de noviembre de 11
php console.php help list




domingo 27 de noviembre de 11
Hello World ... for consoles
          use SymfonyComponentConsoleApplication;
          use SymfonyComponentConsoleInputInputArgument;


          $console = new Application();
          $console
                   ->register('hello')
                   ->setDefinition(array(
                     new InputArgument('name', InputArgument::REQUIRED, 'Name'),
                   ))
                   ->setDescription('It says hello to a person')
                   ->setCode(function ($input, $output) {
                       $name = $input->getArgument('name');
                            $output->writeln(sprintf('Hello <info>%s</info>', $name));
                   })
          ;
          $console->run();


domingo 27 de noviembre de 11
There is a better way to do it, Command




domingo 27 de noviembre de 11
Creating a new command
          use SymfonyComponentConsoleCommandCommand;
          use SymfonyComponentConsoleInputInputArgument;

          class HelloCommand extends Command
          {
            public function configure()
            {
              $this->setName('hello');
              $this->setDefinition(array(
                 new InputArgument('name', InputArgument::REQUIRED, 'Name'),
              ))
              $this->setDescription('Say hello to a person')
            }

              public function execute($input, $output)
              {
                $name = $input->getArgument('name');
                $output->writeln(sprintf('Hello <info>%s</info>', $name));
              }
          }

domingo 27 de noviembre de 11
Creating a new command




          use SymfonyComponentConsoleApplication;


          $console = new Application();
          $console->add(new HelloCommand());
          $console->run();




domingo 27 de noviembre de 11
Thanks
        @loalf
                                Créditos: http://www.flickr.com/photos/normalityrelief/3075723695/


domingo 27 de noviembre de 11

Slides components en

  • 1.
    Components Symfony’s secret weapon Javier López | @loalf domingo 27 de noviembre de 11
  • 2.
    The components domingo 27de noviembre de 11
  • 3.
    The components area set of standalone, decoupled and cohesive PHP libraries that solve common web development problems. domingo 27 de noviembre de 11
  • 4.
    21 Components Browserkit EventDispatcher Security ClassLoader Routing HttpFoundation Finder DependencyInjection Config Console CssSelector Locale Form DomCrawler HttpKernel Serializer Process Templating Yaml Validator Translation domingo 27 de noviembre de 11
  • 5.
    21 Components Browserkit EventDispatcher Security ClassLoader Routing HttpFoundation Finder DependencyInjection Config Console CssSelector Locale Form DomCrawler HttpKernel Serializer Process Templating Yaml Validator Translation domingo 27 de noviembre de 11
  • 6.
    Installing domingo 27 denoviembre de 11
  • 7.
    mkdir ComponentPlayground cd ComponentPlayground mkdir vendor cd vendor git clone https://github.com/symfony/symfony domingo 27 de noviembre de 11
  • 8.
    download domingo 27 denoviembre de 11
  • 9.
    autoload.php <?php require_once __DIR__.'/vendor/symfony/src/Symfony/Component/ ClassLoader/UniversalClassLoader.php'; use SymfonyComponentClassLoaderUniversalClassLoader; $loader = new UniversalClassLoader(); $loader->registerNamespaces(array( 'Symfony' => __DIR__.'/vendor/symfony/src', )); $loader->register(); domingo 27 de noviembre de 11
  • 10.
    sample.php <?php require_once 'autoload.php'; /* * Sample code */ > php sample.php domingo 27 de noviembre de 11
  • 11.
    Yaml domingo 27 denoviembre de 11
  • 12.
    Parsing and generatingYAML files domingo 27 de noviembre de 11
  • 13.
    parsing YAML files use SymfonyComponentYamlYaml; #example.yml $data = Yaml::parse('example.yml'); description: “Users of Symfony” users: print $data['description']; javi: name: “Javi” foreach( $data['users'] as $user) surname: “López” { rob: print $user['name'] name: “Rob” .' '. surname: “Waring” $user['surname']; } domingo 27 de noviembre de 11
  • 14.
    generating YAML files use SymfonyComponentYamlYaml; $data['description'] = "Symfony Users” $data['users'][] = array( description: “Symfony users” 'name' => 'Javi', users: 'surname' => 'Lopez' 0: ); name: “Javi” surname: “López” $data['users'][] = array( 1: 'name' => 'Rob', name: “Rob” 'surname' => 'Waring' surname: “Waring” ); print Yaml::dump($data); domingo 27 de noviembre de 11
  • 15.
    YAML & PHP #example.yml generated: <?php echo date(‘Y’); ?> use SymfonyComponentYamlYaml; description: “Users of Symfony” users: Yaml::enablePhpParsing(); javi: name: “Javi” $data = Yaml::parse('example.yml'); surname: “López” rob: print $data['generated']; name: “Rob” surname: “Waring” domingo 27 de noviembre de 11
  • 16.
    Finder domingo 27 denoviembre de 11
  • 17.
    Finding files anddirectories the easy way domingo 27 de noviembre de 11
  • 18.
    finding by name use SymfonyComponentFinderFinder; $files = Finder::create() ->name("*.php") ->name("*.{php,yml}") ->name("/.(php|yml)$/") ->name("/^w{3,10}$/") ->name("foo.php") ->in(__DIR__); Referencia sobre Patrones Glob: http://cowburn.info/2010/04/30/glob-patterns/ domingo 27 de noviembre de 11
  • 19.
    finding by size use SymfonyComponentFinderFinder; $files = Finder::create() ->size("> 10k") ->size("<= 4mi") ->size("2gi") ->in(__DIR__); k = 1000 ki = 1024 m = 1000^2 mi = 1024^2 g = 1000^3 gi = 1024^3 domingo 27 de noviembre de 11
  • 20.
    finding by date use SymfonyComponentFinderFinder; $files = Finder::create() ->date("since yesterday") ->date("until 2 days ago") ->date("> now - 2 hours") ->date(">= 2005-10-15 ") ->in(__DIR__); Every parameter valid to strtotime() domingo 27 de noviembre de 11
  • 21.
    fixing the depth use SymfonyComponentFinderFinder; $files = Finder::create() ->depth(0) ->depth(>1) ->depth(<3) ->in(__DIR__); domingo 27 de noviembre de 11
  • 22.
    just files use SymfonyComponentFinderFinder; $files = Finder::create() ->files() ->in(__DIR__); domingo 27 de noviembre de 11
  • 23.
    just directories use SymfonyComponentFinderFinder; $files = Finder::create() ->directories() ->in(__DIR__); domingo 27 de noviembre de 11
  • 24.
    sorting use SymfonyComponentFinderFinder; $files = Finder::create() ->sortByName() ->sortByType() ->sort( function(SplFileInfo $file1, SplFileInfo $file2){ return $file1->getSize() > $file2->getSize(); } ) ->in(__DIR__); domingo 27 de noviembre de 11
  • 25.
    php files inthe project root directory use SymfonyComponentFinderFinder; $files = Finder::create() ->files() ->depth(0) ->name("*.php") ->in(__DIR__); domingo 27 de noviembre de 11
  • 26.
    images in AmazonS3 $s3 = new Zend_Service_Amazon_S3($key, $secret); $s3->registerStreamWrapper("s3"); $files = Finder::create() ->name('*.{jpg,jpeg,png,gif}') ->size('< 100K') ->date('since 1 hour ago') ->in('s3://bucket-name'); domingo 27 de noviembre de 11
  • 27.
    Process domingo 27 denoviembre de 11
  • 28.
    Easening command systemexecution domingo 27 de noviembre de 11
  • 29.
    Is Twitter online? use SymfonyComponentProcessProcess; $process = new Process('ping -c 1 twitter.com'); $process->run(); if($process->isSuccessful()){ print "Twitter is online"; }else{ print "Twitter is offline"; } domingo 27 de noviembre de 11
  • 30.
    ping -c 4twitter.com domingo 27 de noviembre de 11
  • 31.
    showing the averagetime $process = new Process('ping -c 4 twitter.com'); $process->run(); if($process->isSuccessful()) { $output = $process->getOutput(); $pattern = '/time=(d+.d+) ms/'; preg_match_all($pattern, $output, $matches); $average = array_sum($matches[1])/count($matches[1]); printf("Avergage time=%.3f ms", $average); }else{ print "Twitter is offline"; } domingo 27 de noviembre de 11
  • 32.
    showing just thetime use SymfonyComponentProcessProcess; $process = new Process('ping -c 4 twitter.com'); $process->run(function($type, $buffer) { if('out' === $type){ $pattern = '/time=(d+.d+) ms/'; if(preg_match_all($pattern, $buffer, $matches)){; print $matches[0][0]."n"; } }elseif( 'err' === $type ){ print "Twitter is offline"; } }); domingo 27 de noviembre de 11
  • 33.
    DomCrawler domingo 27 denoviembre de 11
  • 34.
    extracting information fromthe DOM domingo 27 de noviembre de 11
  • 35.
    Twitter search use SymfonyComponentDomCrawlerCrawler; $uri = 'http://search.twitter.com/search.atom?q=symfony2'; $crawler = new Crawler(); $content = file_get_contents($uri); $crawler->addXmlContent($content); foreach($crawler->filterXpath('//content') as $node) { print $node->nodeValue; } domingo 27 de noviembre de 11
  • 36.
    Symfony.com blog posts use SymfonyComponentDomCrawlerCrawler; $uri = 'http://symfony.com/blog'; $content = file_get_contents($uri); $crawler = new Crawler($content, $uri); $nodes = $crawler->filterXPath('//div[@class="box_article"]//a'); foreach($nodes->links() as $link) { print $link->getUri(); } domingo 27 de noviembre de 11
  • 37.
  • 38.
    CSS Selector =>XPath expressions domingo 27 de noviembre de 11
  • 39.
    from CSS toXPath use SymfonyComponentCssSelectorCssSelector; print CssSelector::toXPath('div.box_article a'); /* * descendant-or-self::div[ * contains( * concat(' ', normalize- space(@class), ' '), * ' box_article ' * ) * ]/descendant::a */ domingo 27 de noviembre de 11
  • 40.
    Symfony.com blog posts use SymfonyComponentDomCrawlerCrawler; $uri = 'http://symfony.com/blog'; $content = file_get_contents($uri); $crawler = new Crawler($content, $uri); $nodes = $crawler->filter('div.box_article a'); domingo 27 de noviembre de 11
  • 41.
    Templating domingo 27 denoviembre de 11
  • 42.
    A simple andeasy template engine domingo 27 de noviembre de 11
  • 43.
    4 words domingo 27de noviembre de 11
  • 44.
    Loader: finds atemplate domingo 27 de noviembre de 11
  • 45.
    NameParser: converts templatesname to templates objects domingo 27 de noviembre de 11
  • 46.
    Engine: renders templates domingo27 de noviembre de 11
  • 47.
    Helpers: adds extrafunctionality domingo 27 de noviembre de 11
  • 48.
    A simple example // __DIR__/templates/index.php <?php echo $name; ?> domingo 27 de noviembre de 11
  • 49.
    A simple example use SymfonyComponentTemplatingLoaderFilesystemLoader; use SymfonyComponentTemplatingPhpEngine; use SymfonyComponentTemplatingTemplateNameParser; $loader = new FilesystemLoader( array(__DIR__.'/templates/%name%.php') ); $parser = new TemplateNameParser(); $engine = new PhpEngine($parser, $loader); echo $engine->render('index', array('name' => 'Javi')); domingo 27 de noviembre de 11
  • 50.
    Inheritance // __DIR__/templates/layout.php <div id="header"> <h1>Cabecera</h1> </div> <div id="content"> <?php echo $view['slots']->get('_content'); ?> </div> <div id="footer"> <p>Pie</p> </div> domingo 27 de noviembre de 11
  • 51.
    Inheritance // __DIR__/templates/index.php <?php echo $view->extend('layout'); ?> <p> <?php echo $name; ?> </p> domingo 27 de noviembre de 11
  • 52.
    Inheritance use SymfonyComponentTemplatingHelperSlotsHelper; $loader = new FilesystemLoader( array(__DIR__.'/templates/%name%.php') ); $parser = new TemplateNameParser(); $engine = new PhpEngine($parser, $loader, new SlotsHelper()); echo $engine->render('index', array('name' => 'Javi')); domingo 27 de noviembre de 11
  • 53.
    Inheritance <div id="header"> <h1>Cabecera</h1> </div> <div id="content"> <p>Javi</p> </div> <div id="footer"> <p>Pie</p> </div> domingo 27 de noviembre de 11
  • 54.
    and many more... ... slots ... global variables ... escaping ... assets managment ... cache domingo 27 de noviembre de 11
  • 55.
    Validator domingo 27 denoviembre de 11
  • 56.
    asserting variable orobject values domingo 27 de noviembre de 11
  • 57.
    Validating a valueis not null use SymfonyComponentValidatorConstraintsNotNull; use SymfonyComponentValidatorConstraintsNotNullValidator; $validator = new NotNullValidator(); if(!$validator->isValid(null, new NotNull())) { print $validator->getMessageTemplate(); // "The value should not be null" } domingo 27 de noviembre de 11
  • 58.
    24 Validators Blank Max Date NotBlank Min Time Null Url DateTime NotNull Email Locale True IP Language False File Country Choice Image Collection Type Size Callback domingo 27 de noviembre de 11
  • 59.
    Using the Validatorservice use SymfonyComponentValidatorValidator; use SymfonyComponentValidatorConstraintValidatorFactory; use SymfonyComponentValidatorMappingBlackholeMetadataFactory; use SymfonyComponentValidatorConstraints as Asserts; $validator = new Validator( new BlackholeMetadataFactory, new ConstraintValidatorFactory ); $errors = $validator->validateValue('', new AssertsNotBlank()); if($errors->count()) { print $errors; } ConstraintViolationList domingo 27 de noviembre de 11
  • 60.
    Validando un objeto(PHP) class Person { public $name; public $age; } $name must not be empty $age must be a number between 18 and 99 domingo 27 de noviembre de 11
  • 61.
    Validating an object(PHP) use SymfonyComponentValidatorValidator; use SymfonyComponentValidatorConstraintValidatorFactory; use SymfonyComponentValidatorMappingClassMetadataFactory; use SymfonyComponentValidatorMappingLoaderStaticMethodLoader; $validator = new Validator( new ClassMetadataFactory(new StaticMethodLoader() ), new ConstraintValidatorFactory() ); $person = new Person(); $errors = $validator->validate($person); domingo 27 de noviembre de 11
  • 62.
    Validating an object(PHP) use SymfonyComponentValidatorMappingClassMetadata; use SymfonyComponentValidatorConstraint as Asserts; class Person { public $name; public $age; static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata ->addPropertyConstraint('name', new AssertsNotBlank()) ->addPropertyConstraint('age' , new AssertsMin(18)); ->addPropertyConstraint('age' , new AssertsMax(99)); } } domingo 27 de noviembre de 11
  • 63.
    Validando un objeto(YAML) class Person { public $name; public $age; } $name must not be empty $age must be a number between 18 and 99 domingo 27 de noviembre de 11
  • 64.
    Validating an object(YAML) # validate.yml Person: properties: name: - NotBlank : ~ age: - Min: 18 - Max: 99 domingo 27 de noviembre de 11
  • 65.
    Validating an object(YAML) use SymfonyComponentValidatorValidator; use SymfonyComponentValidatorConstraintValidatorFactory; use SymfonyComponentValidatorMappingClassMetadataFactory; use SymfonyComponentValidatorMappingLoaderYamlFileLoader; $validator = new Validator( new ClassMetadataFactory( new YamlFileLoader(__DIR__.'/validate.yml') ), new ConstraintValidatorFactory() ); $person = new Person(); $errors = $validator->validate($person); domingo 27 de noviembre de 11
  • 66.
    Console domingo 27 denoviembre de 11
  • 67.
    Creating repetive tasks domingo27 de noviembre de 11
  • 68.
    The easiest consoleever // console.php use SymfonyComponentConsoleApplication; $console = new Application(); $console->run(); domingo 27 de noviembre de 11
  • 69.
    php console.php domingo 27de noviembre de 11
  • 70.
    php console.php help domingo27 de noviembre de 11
  • 71.
    php console.php helplist domingo 27 de noviembre de 11
  • 72.
    Hello World ...for consoles use SymfonyComponentConsoleApplication; use SymfonyComponentConsoleInputInputArgument; $console = new Application(); $console ->register('hello') ->setDefinition(array( new InputArgument('name', InputArgument::REQUIRED, 'Name'), )) ->setDescription('It says hello to a person') ->setCode(function ($input, $output) { $name = $input->getArgument('name'); $output->writeln(sprintf('Hello <info>%s</info>', $name)); }) ; $console->run(); domingo 27 de noviembre de 11
  • 73.
    There is abetter way to do it, Command domingo 27 de noviembre de 11
  • 74.
    Creating a newcommand use SymfonyComponentConsoleCommandCommand; use SymfonyComponentConsoleInputInputArgument; class HelloCommand extends Command { public function configure() { $this->setName('hello'); $this->setDefinition(array( new InputArgument('name', InputArgument::REQUIRED, 'Name'), )) $this->setDescription('Say hello to a person') } public function execute($input, $output) { $name = $input->getArgument('name'); $output->writeln(sprintf('Hello <info>%s</info>', $name)); } } domingo 27 de noviembre de 11
  • 75.
    Creating a newcommand use SymfonyComponentConsoleApplication; $console = new Application(); $console->add(new HelloCommand()); $console->run(); domingo 27 de noviembre de 11
  • 76.
    Thanks @loalf Créditos: http://www.flickr.com/photos/normalityrelief/3075723695/ domingo 27 de noviembre de 11