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

Más contenido relacionado

PDF
Componentes, el arma secreta de Symfony2
PDF
Clase 14 doctrine - subir archivos
PDF
RabbitMQ y Symfony
PDF
Clase 14 bundles útiles
PDF
Cómo domar SonataAdminBundle
PDF
ORM Doctrine
ODP
Desarrollo de aplicaciones web usando Catalyst y jQuery
ODP
Desarrollando aplicaciones web usando Catalyst y jQuery
Componentes, el arma secreta de Symfony2
Clase 14 doctrine - subir archivos
RabbitMQ y Symfony
Clase 14 bundles útiles
Cómo domar SonataAdminBundle
ORM Doctrine
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery

La actualidad más candente (19)

PDF
Deployer PHP. Presentación para #PHPSevilla
ODP
Desarrollo de aplicaciones web usando Catalyst y jQuery
PDF
Clase 2 conceptos fundamentales
PDF
Servlets que manejan datos de formularios HTML
PDF
Gulp js php sevilla 28 septiembre 2016
PDF
jQuery 1.3 Eghost Julio2009
PDF
Clase 5 controller
KEY
Creación de Builders y DSL's con Groovy
PDF
Doctrine2 sf2Vigo
DOCX
PDF
Find File Servlet DB
PDF
Curso Drupal. Creacion de modulos en Drupal
PDF
Introduccion a Doctrine 2 ORM
PDF
Jsp directiva page
PDF
Funciones disponibles en php 2014
KEY
Creación de plugins con Grails
PDF
5/9 Curso JEE5, Soa, Web Services, ESB y XML
PDF
Ejemplos de php_mysql
PDF
Acciones JSP
Deployer PHP. Presentación para #PHPSevilla
Desarrollo de aplicaciones web usando Catalyst y jQuery
Clase 2 conceptos fundamentales
Servlets que manejan datos de formularios HTML
Gulp js php sevilla 28 septiembre 2016
jQuery 1.3 Eghost Julio2009
Clase 5 controller
Creación de Builders y DSL's con Groovy
Doctrine2 sf2Vigo
Find File Servlet DB
Curso Drupal. Creacion de modulos en Drupal
Introduccion a Doctrine 2 ORM
Jsp directiva page
Funciones disponibles en php 2014
Creación de plugins con Grails
5/9 Curso JEE5, Soa, Web Services, ESB y XML
Ejemplos de php_mysql
Acciones JSP

Destacado (6)

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

Similar a Slides components en (20)

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

Más de Javier López (6)

PDF
Continous Delivering a PHP application
PDF
One commit, one release. Continuously delivering a Symfony project.
PDF
PHP's FIG and PSRs
PDF
Slides changes symfony23
KEY
Slides componentes
ODP
Symfony y Admin Generator
Continous Delivering a PHP application
One commit, one release. Continuously delivering a Symfony project.
PHP's FIG and PSRs
Slides changes symfony23
Slides componentes
Symfony y Admin Generator

Último (20)

PDF
Virus y otras amenazas _ Ciudadanía _ INCIBE.pdf
DOCX
Planeaciónnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
PPTX
Cumplimiento de ISO 27002 Nubes Púb.pptx
PDF
Conceptos básicos de programación PseInt laura.pdf
PPTX
seguridad digital ,paloma bernabe alvarez.
PPTX
IMPORTANCIA EMPRESARIAL , TIPOS DE ESTRUCCTURAp.pptx
PDF
Reduciendo el Ciber Riesgo en Entornos Financieros
PDF
Estrategia de apoyo de tecnología 9-5 Daylin Castaño
PDF
Introducción a REALITY (agosto de 2024).pdf
PDF
EL RESPETO mejororado para aprender .pdf
PPTX
Más Allá del SOC Tradicional: IA y Automatización para Cumplimiento y Respues...
PDF
conceptosbsicosdeprogramacinpseintlaura.pdf
PPTX
LEGALIZACIÓN Y VERIFICACIÓN DE UN APARATO TAXÍMETRO
PPTX
en este libro encontrarás la lectura inicial para tus niños
PPTX
1.Introducción a los sistemas de control.pptx
PDF
Más Allá de la Autenticación: Gestión Moderna de Identidad en el sector Finan...
PDF
Especificación Técnica - Cable TSCGEWOEU _ Feichun Cable Co., Ltd_.pdf
PDF
sol tecnología 2025.pdf........pdf10-7grado
PDF
004-CC2014-Irrigacion Mbb equinos del mundo
PDF
Gtd Infraestructura Digital de Misión Critica
Virus y otras amenazas _ Ciudadanía _ INCIBE.pdf
Planeaciónnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
Cumplimiento de ISO 27002 Nubes Púb.pptx
Conceptos básicos de programación PseInt laura.pdf
seguridad digital ,paloma bernabe alvarez.
IMPORTANCIA EMPRESARIAL , TIPOS DE ESTRUCCTURAp.pptx
Reduciendo el Ciber Riesgo en Entornos Financieros
Estrategia de apoyo de tecnología 9-5 Daylin Castaño
Introducción a REALITY (agosto de 2024).pdf
EL RESPETO mejororado para aprender .pdf
Más Allá del SOC Tradicional: IA y Automatización para Cumplimiento y Respues...
conceptosbsicosdeprogramacinpseintlaura.pdf
LEGALIZACIÓN Y VERIFICACIÓN DE UN APARATO TAXÍMETRO
en este libro encontrarás la lectura inicial para tus niños
1.Introducción a los sistemas de control.pptx
Más Allá de la Autenticación: Gestión Moderna de Identidad en el sector Finan...
Especificación Técnica - Cable TSCGEWOEU _ Feichun Cable Co., Ltd_.pdf
sol tecnología 2025.pdf........pdf10-7grado
004-CC2014-Irrigacion Mbb equinos del mundo
Gtd Infraestructura Digital de Misión Critica

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