SlideShare une entreprise Scribd logo
1  sur  76
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Curso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en DrupalCurso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en Drupal
Mediaglobe Innova
 
Jsp directiva page
Jsp directiva pageJsp directiva page
Jsp directiva page
jubacalo
 
Ejemplos de php_mysql
Ejemplos de php_mysqlEjemplos de php_mysql
Ejemplos de php_mysql
I LG
 
Acciones JSP
Acciones JSPAcciones JSP
Acciones JSP
jubacalo
 

Tendances (19)

Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevilla
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Clase 2 conceptos fundamentales
Clase 2   conceptos fundamentalesClase 2   conceptos fundamentales
Clase 2 conceptos fundamentales
 
Servlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLServlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTML
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016
 
jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controller
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
Servicios web
Servicios webServicios web
Servicios web
 
Find File Servlet DB
Find File Servlet DBFind File Servlet DB
Find File Servlet DB
 
Curso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en DrupalCurso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en Drupal
 
Introduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORMIntroduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORM
 
Jsp directiva page
Jsp directiva pageJsp directiva page
Jsp directiva page
 
Funciones disponibles en php 2014
Funciones disponibles en php 2014Funciones disponibles en php 2014
Funciones disponibles en php 2014
 
Creación de plugins con Grails
Creación de plugins con GrailsCreación de plugins con Grails
Creación de plugins con Grails
 
5/9 Curso JEE5, Soa, Web Services, ESB y XML
5/9 Curso JEE5, Soa, Web Services, ESB y XML5/9 Curso JEE5, Soa, Web Services, ESB y XML
5/9 Curso JEE5, Soa, Web Services, ESB y XML
 
Ejemplos de php_mysql
Ejemplos de php_mysqlEjemplos de php_mysql
Ejemplos de php_mysql
 
Acciones JSP
Acciones JSPAcciones JSP
Acciones JSP
 

En vedette (6)

Young, phillip open source nos
Young, phillip open source nosYoung, phillip open source nos
Young, phillip open source nos
 
C:\Fakepath\Denis Keenan Rvr Presentation July 2010
C:\Fakepath\Denis Keenan Rvr Presentation July 2010C:\Fakepath\Denis Keenan Rvr Presentation July 2010
C:\Fakepath\Denis Keenan Rvr Presentation July 2010
 
Novedades en Symfony 2.3
Novedades en Symfony 2.3Novedades en Symfony 2.3
Novedades en Symfony 2.3
 
Project kwaliteit en implementatie van vraagsturing
Project kwaliteit en implementatie van vraagsturingProject kwaliteit en implementatie van vraagsturing
Project kwaliteit en implementatie van vraagsturing
 
D:\投資大師羅傑斯給寶貝女兒的12封信讀後感
D:\投資大師羅傑斯給寶貝女兒的12封信讀後感D:\投資大師羅傑斯給寶貝女兒的12封信讀後感
D:\投資大師羅傑斯給寶貝女兒的12封信讀後感
 
Shifting gears with Composer
Shifting gears with ComposerShifting gears with Composer
Shifting gears with Composer
 

Similaire à Slides components en

PowerShell para administradores
PowerShell para administradoresPowerShell para administradores
PowerShell para administradores
Pablo Campos
 
Semana 13 ejemplo del uso del rmi
Semana 13   ejemplo del uso del rmiSemana 13   ejemplo del uso del rmi
Semana 13 ejemplo del uso del rmi
TerryJoss
 

Similaire à Slides components en (20)

Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
 
Symfony2
Symfony2Symfony2
Symfony2
 
Jruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVMJruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVM
 
Desymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: BackendDesymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: Backend
 
PowerShell para administradores
PowerShell para administradoresPowerShell para administradores
PowerShell para administradores
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain
 
Jquery
JqueryJquery
Jquery
 
Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2
 
Ruby para Java Developers
Ruby para Java DevelopersRuby para Java Developers
Ruby para Java Developers
 
Semana 13 ejemplo del uso del rmi
Semana 13   ejemplo del uso del rmiSemana 13   ejemplo del uso del rmi
Semana 13 ejemplo del uso del rmi
 
Un newbie conoce a Sinatra
Un newbie conoce a SinatraUn newbie conoce a Sinatra
Un newbie conoce a Sinatra
 
JRuby al Rescate de J2EE
JRuby al Rescate de J2EEJRuby al Rescate de J2EE
JRuby al Rescate de J2EE
 
Fabric más allá de lo básico
Fabric más allá de lo básicoFabric más allá de lo básico
Fabric más allá de lo básico
 
Materiales del curso de Symfony2
Materiales del curso de Symfony2Materiales del curso de Symfony2
Materiales del curso de Symfony2
 
Concurrency with Promise Style – Rayco Araña
Concurrency with Promise Style – Rayco ArañaConcurrency with Promise Style – Rayco Araña
Concurrency with Promise Style – Rayco Araña
 
Docker ECS en AWS
Docker ECS en AWS Docker ECS en AWS
Docker ECS en AWS
 
Meetup training Taller RoR
Meetup training Taller RoR Meetup training Taller RoR
Meetup training Taller RoR
 
FROM lost to the Docker 2020
FROM lost to the Docker 2020FROM lost to the Docker 2020
FROM lost to the Docker 2020
 
Symfony2 y su ecosistema
Symfony2 y su ecosistemaSymfony2 y su ecosistema
Symfony2 y su ecosistema
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!
 

Plus de Javier López

Slides changes symfony23
Slides changes symfony23Slides changes symfony23
Slides changes symfony23
Javier López
 
Symfony y Admin Generator
Symfony y Admin GeneratorSymfony y Admin Generator
Symfony y Admin Generator
Javier López
 

Plus de Javier López (6)

Continous Delivering a PHP application
Continous Delivering a PHP applicationContinous Delivering a PHP application
Continous Delivering a PHP application
 
One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.
 
PHP's FIG and PSRs
PHP's FIG and PSRsPHP's FIG and PSRs
PHP's FIG and PSRs
 
Slides changes symfony23
Slides changes symfony23Slides changes symfony23
Slides changes symfony23
 
Slides componentes
Slides componentesSlides componentes
Slides componentes
 
Symfony y Admin Generator
Symfony y Admin GeneratorSymfony y Admin Generator
Symfony y Admin Generator
 

Dernier

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Dernier (11)

EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 

Slides components en

  • 1. Components Symfony’s secret weapon Javier López | @loalf domingo 27 de noviembre de 11
  • 2. The components domingo 27 de noviembre de 11
  • 3. The components are a 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 de noviembre 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 de noviembre 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 de noviembre de 11
  • 12. Parsing and generating YAML 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 de noviembre de 11
  • 17. Finding files and directories 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 in the project root directory use SymfonyComponentFinderFinder; $files = Finder::create() ->files() ->depth(0) ->name("*.php") ->in(__DIR__); domingo 27 de noviembre de 11
  • 26. 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
  • 27. Process domingo 27 de noviembre de 11
  • 28. Easening command system execution 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 4 twitter.com domingo 27 de noviembre de 11
  • 31. 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
  • 32. 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
  • 33. DomCrawler domingo 27 de noviembre de 11
  • 34. extracting information from the 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. CssSelector domingo 27 de noviembre de 11
  • 38. CSS Selector => XPath expressions domingo 27 de noviembre de 11
  • 39. 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
  • 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 de noviembre de 11
  • 42. A simple and easy template engine domingo 27 de noviembre de 11
  • 43. 4 words domingo 27 de noviembre de 11
  • 44. Loader: finds a template domingo 27 de noviembre de 11
  • 45. NameParser: converts templates name to templates objects domingo 27 de noviembre de 11
  • 46. Engine: renders templates domingo 27 de noviembre de 11
  • 47. Helpers: adds extra functionality 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 de noviembre de 11
  • 56. asserting variable or object values domingo 27 de noviembre de 11
  • 57. 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
  • 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 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
  • 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 de noviembre de 11
  • 67. Creating repetive tasks domingo 27 de noviembre de 11
  • 68. The easiest console ever // console.php use SymfonyComponentConsoleApplication; $console = new Application(); $console->run(); domingo 27 de noviembre de 11
  • 69. php console.php domingo 27 de noviembre de 11
  • 70. php console.php help domingo 27 de noviembre de 11
  • 71. php console.php help list 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 a better way to do it, Command domingo 27 de noviembre de 11
  • 74. 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
  • 75. Creating a new command 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