SlideShare ist ein Scribd-Unternehmen logo
1 von 64
Downloaden Sie, um offline zu lesen
#deSymfony        Javier López | @loalf

domingo 17 de junio de 12
#deSymfony        Javier López | @loalf

domingo 17 de junio de 12
Javier López

                            Nací en Córdoba, España.

                            Vivo en Londres, Reino Unido.

                            Trabajo en IPC Media (http://ipcmedia.com).

                            Escribo (a veces) en mi blog (http://loalf.wordpress.com).

                            Twitteo como @loalf



                              ... ¿quiéres saber más? http://www.linkedin.com/in/loalf




domingo 17 de junio de 12
Los componentes




domingo 17 de junio de 12
http://fabien.potencier.org/article/49/what-is-symfony2




domingo 17 de junio de 12
Son un conjunto de librerías autónomas,
                desacopladas y complementarias que resuelven
                problemas comunes del desarrollo web




domingo 17 de junio de 12
22 Componentes

                                          EventDispatcher        Validator


                            Browserkit       ClassLoader         Routing          HttpFoundation


                            Filesystem          Finder      DependencyInjection       Config


                             Security          Console         CssSelector           Locale


                            Translation          Form          DomCrawler           HttpKernel


                              Yaml            Serializer         Process           Templating




domingo 17 de junio de 12
22 Componentes

                                          EventDispatcher        Validator


                            Browserkit       ClassLoader         Routing          HttpFoundation


                            Filesystem          Finder      DependencyInjection       Config


                             Security          Console         CssSelector           Locale


                            Translation          Form          DomCrawler           HttpKernel


                              Yaml            Serializer         Process           Templating




domingo 17 de junio de 12
Instalación




domingo 17 de junio de 12
mkdir ComponentsPlayground
                            cd ComponentsPlayground
                            mkdir vendor
                            cd vendor
                            git clone https://github.com/symfony/symfony




domingo 17 de junio de 12
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 17 de junio de 12
ejemplo.php

           <?php

           require_once 'autoload.php';

           /*
             * Código del ejemplo
             */




         > php ejemplo.php




domingo 17 de junio de 12
Yaml




domingo 17 de junio de 12
Parsea y genera archivos yml




domingo 17 de junio de 12
parseando archivos YAML

         #example.yml                         use SymfonyComponentYamlYaml;

         descripcion: “Usuarios de symfony”   $data = Yaml::parse('example.yml');
         usuarios:
           -                                  print $data['descripcion'];
             nombre: “Javi”
             apellidos: “López”               foreach( $data['usuarios'] as $usuario)
           -                                  {
             nombre: “Raúl”                     print $usuario['nombre'].' '.
             apellidos: “Fraile”                      $usuario['apellidos'];
                                              }




domingo 17 de junio de 12
generando archivos YAML

       use SymfonyComponentYamlYaml;

       $data['descripcion'] = "Usuarios de
       symfony";
                                                 descripcion: “Usuarios de symfony”
       $data['usuarios'][] = array(              usuarios:
          'nombre' => 'Javi',                      0:
          'apellidos' => 'Lopez'                      nombre: “Javi”
       );                                             apellidos: “López”
                                                   1:
       $data['usuarios'][] = array(                   nombre: “Raúl”
          'nombre' => 'Raul',                         apellidos: “Fraile”
          'apellidos' => 'Fraile'
       );

       print Yaml::dump($data);




domingo 17 de junio de 12
YAML & PHP

         #example.yml

         generado: <?php echo date(‘d-m-Y’); ?>   use SymfonyComponentYamlYaml;
         descripcion: “Usuarios de symfony”
         usuarios:                                Yaml::enablePhpParsing();
           javi:
             nombre: “Javi”                       $data = Yaml::parse('example.yml');
             apellidos: “López”
           raul:                                  print $data['generado'];
             nombre: “Raúl”
             apellidos: “Fraile”




domingo 17 de junio de 12
Finder




domingo 17 de junio de 12
Herramienta para encontrar archivos y directorios




domingo 17 de junio de 12
buscando archivos por nombre


             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 17 de junio de 12
buscando archivos por tamaño

             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 17 de junio de 12
buscando archivos por fecha


             use SymfonyComponentFinderFinder;


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




         Parámetro es cualquier argumento válido para strtotime()



domingo 17 de junio de 12
fijando el nivel de profundidad


             use SymfonyComponentFinderFinder;


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




domingo 17 de junio de 12
buscando sólo archivos



             use SymfonyComponentFinderFinder;


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




domingo 17 de junio de 12
buscando sólo directorios


             use SymfonyComponentFinderFinder;


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




domingo 17 de junio de 12
obteniendo un resultado ordenado

             use SymfonyComponentFinderFinder;


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




domingo 17 de junio de 12
archivos php en la carpeta raíz del proyecto


             use SymfonyComponentFinderFinder;


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




domingo 17 de junio de 12
Process




domingo 17 de junio de 12
Facilita la ejecución de comandos del sistema




domingo 17 de junio de 12
¿está Twitter online?

             use SymfonyComponentProcessProcess;


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


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




domingo 17 de junio de 12
ping -c 4 twitter.com




domingo 17 de junio de 12
calculando tiempos medios de respuesta
             $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 está offline";
             }

domingo 17 de junio de 12
Validator




domingo 17 de junio de 12
Ayuda a validar tanto variables como objetos




domingo 17 de junio de 12
Validando que un valor sea no nulo



           use SymfonyComponentValidatorConstraintsNotNull;
           use SymfonyComponentValidatorConstraintsNotNullValidator;


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




domingo 17 de junio de 12
24 Validadores
                             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 17 de junio de 12
Usando la clase Validator
           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 17 de junio de 12
Validando un objeto (PHP)


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




           $name no puede ser una cadena vacía
           $age deberán ser un número comprendido entre 18 y 99 años




domingo 17 de junio de 12
Validando un objeto (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 17 de junio de 12
Validando un objeto (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 17 de junio de 12
Validando un objeto (YAML)


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




           $name no puede ser una cadena vacía
           $age deberán ser un número comprendido entre 18 y 99 años




domingo 17 de junio de 12
Validando un objeto (YAML)


           # validate.yml


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




domingo 17 de junio de 12
Validando un objeto (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 17 de junio de 12
Serializer




domingo 17 de junio de 12
Cuando todo es un array




domingo 17 de junio de 12
Objeto



                               denormalize            normalize


                 deserialize                                      serialize
                                             Array


                                                      encode
                                   decode


                                      Formato (JSON, XML)




domingo 17 de junio de 12
Serializando un objeto
                   class Person
                   {
                     private $age;
                     private $name;

                       public function getName()
                       {
                         return $this->name;
                       }
                       public function getAge()
                       {
                         return $this->age;
                       }
                       public function setName($name)
                       {
                         $this->name = $name;
                       }
                       public function setAge($age)
                       {
                         $this->age = $age;
                       }
                   }


domingo 17 de junio de 12
Serializando un objeto

        use      SymfonyComponentSerializerSerializer;
        use      SymfonyComponentSerializerEncoderXmlEncoder;
        use      SymfonyComponentSerializerEncoderJsonEncoder;
        use      SymfonyComponentSerializerNormalizerGetSetMethodNormalizer;

        $person = new Person(19, 'Javi');

        $encoders = array(new XmlEncoder(), new JsonEncoder() );

        $normalizers = array(new GetSetMethodNormalizer());

        $serializer = new Serializer($normalizers, $encoders);

        $serializer->serialize($person, 'json');// {"name":"Javi","age":19}




domingo 17 de junio de 12
Deserializando un objeto


                  data = <<<EOF
                  <person>
                    <name>Javi</name>
                    <age>19</age>
                  </person>
                  EOF;

                  $person = $serializer->deserialize($data,'Person','xml');




domingo 17 de junio de 12
Console




domingo 17 de junio de 12
Facilita la creación de tareas repetitivas




domingo 17 de junio de 12
La consola más sencilla



           // console.php


           use SymfonyComponentConsoleApplication;


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




domingo 17 de junio de 12
php console.php




domingo 17 de junio de 12
php console.php help




domingo 17 de junio de 12
php console.php help list




domingo 17 de junio de 12
Hola mundo ... para consolas
           use SymfonyComponentConsoleApplication;
           use SymfonyComponentConsoleInputInputArgument;


           $console = new Application();
           $console
                    ->register('hello')
                    ->setDefinition(array(
                      new InputArgument('name', InputArgument::REQUIRED, 'Nombre'),
                    ))
                    ->setDescription('Saluda a una persona')
                    ->setCode(function ($input, $output) {
                        $name = $input->getArgument('name');
                            $output->writeln(sprintf('Hola <info>%s</info>', $name));
                    })
           ;
           $console->run();


domingo 17 de junio de 12
Hay una manera mejor de hacerlo, Command




domingo 17 de junio de 12
Creando un nuevo comando
           use SymfonyComponentConsoleCommandCommand;
           use SymfonyComponentConsoleInputInputArgument;

           class HelloCommand extends Command
           {
             public function configure()
             {
               $this->setName('hello');
               $this->setDefinition(array(
                  new InputArgument('name', InputArgument::REQUIRED, 'Nombre'),
               ))
               $this->setDescription('Saluda a una persona')
             }

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

domingo 17 de junio de 12
Creando un nuevo comando


           use SymfonyComponentConsoleApplication;


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




domingo 17 de junio de 12
Antes de irme




domingo 17 de junio de 12
Divide y vencerás




domingo 17 de junio de 12
Los tests son una excelente documentación




domingo 17 de junio de 12
Check it out!
                            http://github.com:loalf/Sf2ComponentsPlayground.git




domingo 17 de junio de 12
Gracias
         @loalf             IPC Media está reclutando, búscame si estás pensando en
                                                              mudarte a Londres

                                              Créditos: http://www.flickr.com/photos/normalityrelief/3075723695/

domingo 17 de junio de 12

Weitere ähnliche Inhalte

Was ist angesagt?

Programa de arbol
Programa  de arbol Programa  de arbol
Programa de arbol
zxxsasukexxz
 
Manejo de archivos en java
Manejo de archivos en javaManejo de archivos en java
Manejo de archivos en java
MaiirOn Gaitan
 

Was ist angesagt? (18)

Funciones disponibles en php 2014
Funciones disponibles en php 2014Funciones disponibles en php 2014
Funciones disponibles en php 2014
 
Grails
GrailsGrails
Grails
 
Primitive Obsession. FrontFest 2020
Primitive Obsession. FrontFest 2020Primitive Obsession. FrontFest 2020
Primitive Obsession. FrontFest 2020
 
Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevilla
 
Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
 
Groovy no es java sin puntos y comas - Codemotion Madrid 2014
Groovy no es java sin puntos y comas - Codemotion Madrid 2014Groovy no es java sin puntos y comas - Codemotion Madrid 2014
Groovy no es java sin puntos y comas - Codemotion Madrid 2014
 
Programa de arbol
Programa  de arbol Programa  de arbol
Programa de arbol
 
Docker 101 - dockers y Bases de Datos DB
Docker 101 -  dockers y Bases de Datos DBDocker 101 -  dockers y Bases de Datos DB
Docker 101 - dockers y Bases de Datos DB
 
Práctico de variables
Práctico de variablesPráctico de variables
Práctico de variables
 
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
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controller
 
Manejo de archivos en java
Manejo de archivos en javaManejo de archivos en java
Manejo de archivos en java
 
Comandos para ubuntu 400 que debes conocer
Comandos para ubuntu 400 que debes conocerComandos para ubuntu 400 que debes conocer
Comandos para ubuntu 400 que debes conocer
 
400 comandos linux
400 comandos linux400 comandos linux
400 comandos linux
 
Single table inheritance
Single table inheritanceSingle table inheritance
Single table inheritance
 
Comandos linux
Comandos linuxComandos linux
Comandos linux
 
Clase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScriptClase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScript
 
Clase 6 objetos de javaScript
Clase 6 objetos de javaScriptClase 6 objetos de javaScript
Clase 6 objetos de javaScript
 

Ähnlich wie Componentes, el arma secreta de Symfony2

PowerShell para administradores
PowerShell para administradoresPowerShell para administradores
PowerShell para administradores
Pablo Campos
 
Introducción a phone gap
Introducción a phone gapIntroducción a phone gap
Introducción a phone gap
Rodrigo Corral
 
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
 

Ähnlich wie Componentes, el arma secreta de Symfony2 (20)

Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
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
 
Un newbie conoce a Sinatra
Un newbie conoce a SinatraUn newbie conoce a Sinatra
Un newbie conoce a Sinatra
 
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
 
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
 
2 7 ficheros_php
2 7 ficheros_php2 7 ficheros_php
2 7 ficheros_php
 
Ruby para Java Developers
Ruby para Java DevelopersRuby para Java Developers
Ruby para Java Developers
 
Seguridad en Android
Seguridad en AndroidSeguridad en Android
Seguridad en Android
 
Symfony2
Symfony2Symfony2
Symfony2
 
Fundamento de poo en php
Fundamento de poo en phpFundamento de poo en php
Fundamento de poo en php
 
Jquery
JqueryJquery
Jquery
 
Introducción a phone gap
Introducción a phone gapIntroducción a phone gap
Introducción a phone gap
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery
 
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
 
Creación de plugins con Grails
Creación de plugins con GrailsCreación de plugins con Grails
Creación de plugins con Grails
 
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
 
Jquery parte 1
Jquery parte 1Jquery parte 1
Jquery parte 1
 
Presentacion YII
Presentacion YIIPresentacion YII
Presentacion YII
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!
 

Mehr von Javier López

Slides changes symfony23
Slides changes symfony23Slides changes symfony23
Slides changes symfony23
Javier López
 
Shifting gears with Composer
Shifting gears with ComposerShifting gears with Composer
Shifting gears with Composer
Javier López
 
Symfony y Admin Generator
Symfony y Admin GeneratorSymfony y Admin Generator
Symfony y Admin Generator
Javier López
 

Mehr von Javier López (8)

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
 
Novedades en Symfony 2.3
Novedades en Symfony 2.3Novedades en Symfony 2.3
Novedades en Symfony 2.3
 
Shifting gears with Composer
Shifting gears with ComposerShifting gears with Composer
Shifting gears with Composer
 
Slides componentes
Slides componentesSlides componentes
Slides componentes
 
Symfony y Admin Generator
Symfony y Admin GeneratorSymfony y Admin Generator
Symfony y Admin Generator
 

Kürzlich hochgeladen

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Kürzlich hochgeladen (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
 
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
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
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
 
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
 
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...
 
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.
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 

Componentes, el arma secreta de Symfony2

  • 1. #deSymfony Javier López | @loalf domingo 17 de junio de 12
  • 2. #deSymfony Javier López | @loalf domingo 17 de junio de 12
  • 3. Javier López Nací en Córdoba, España. Vivo en Londres, Reino Unido. Trabajo en IPC Media (http://ipcmedia.com). Escribo (a veces) en mi blog (http://loalf.wordpress.com). Twitteo como @loalf ... ¿quiéres saber más? http://www.linkedin.com/in/loalf domingo 17 de junio de 12
  • 4. Los componentes domingo 17 de junio de 12
  • 6. Son un conjunto de librerías autónomas, desacopladas y complementarias que resuelven problemas comunes del desarrollo web domingo 17 de junio de 12
  • 7. 22 Componentes EventDispatcher Validator Browserkit ClassLoader Routing HttpFoundation Filesystem Finder DependencyInjection Config Security Console CssSelector Locale Translation Form DomCrawler HttpKernel Yaml Serializer Process Templating domingo 17 de junio de 12
  • 8. 22 Componentes EventDispatcher Validator Browserkit ClassLoader Routing HttpFoundation Filesystem Finder DependencyInjection Config Security Console CssSelector Locale Translation Form DomCrawler HttpKernel Yaml Serializer Process Templating domingo 17 de junio de 12
  • 10. mkdir ComponentsPlayground cd ComponentsPlayground mkdir vendor cd vendor git clone https://github.com/symfony/symfony domingo 17 de junio de 12
  • 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 17 de junio de 12
  • 12. ejemplo.php <?php require_once 'autoload.php'; /* * Código del ejemplo */ > php ejemplo.php domingo 17 de junio de 12
  • 13. Yaml domingo 17 de junio de 12
  • 14. Parsea y genera archivos yml domingo 17 de junio de 12
  • 15. parseando archivos YAML #example.yml use SymfonyComponentYamlYaml; descripcion: “Usuarios de symfony” $data = Yaml::parse('example.yml'); usuarios: - print $data['descripcion']; nombre: “Javi” apellidos: “López” foreach( $data['usuarios'] as $usuario) - { nombre: “Raúl” print $usuario['nombre'].' '. apellidos: “Fraile” $usuario['apellidos']; } domingo 17 de junio de 12
  • 16. generando archivos YAML use SymfonyComponentYamlYaml; $data['descripcion'] = "Usuarios de symfony"; descripcion: “Usuarios de symfony” $data['usuarios'][] = array( usuarios: 'nombre' => 'Javi', 0: 'apellidos' => 'Lopez' nombre: “Javi” ); apellidos: “López” 1: $data['usuarios'][] = array( nombre: “Raúl” 'nombre' => 'Raul', apellidos: “Fraile” 'apellidos' => 'Fraile' ); print Yaml::dump($data); domingo 17 de junio de 12
  • 17. YAML & PHP #example.yml generado: <?php echo date(‘d-m-Y’); ?> use SymfonyComponentYamlYaml; descripcion: “Usuarios de symfony” usuarios: Yaml::enablePhpParsing(); javi: nombre: “Javi” $data = Yaml::parse('example.yml'); apellidos: “López” raul: print $data['generado']; nombre: “Raúl” apellidos: “Fraile” domingo 17 de junio de 12
  • 18. Finder domingo 17 de junio de 12
  • 19. Herramienta para encontrar archivos y directorios domingo 17 de junio de 12
  • 20. buscando archivos por nombre 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 17 de junio de 12
  • 21. buscando archivos por tamaño 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 17 de junio de 12
  • 22. buscando archivos por fecha use SymfonyComponentFinderFinder; $files = Finder::create() ->date("since yesterday") ->date("until 2 days ago") ->date("> now - 2 hours") ->date(">= 2005-10-15 ") ->in(__DIR__); Parámetro es cualquier argumento válido para strtotime() domingo 17 de junio de 12
  • 23. fijando el nivel de profundidad use SymfonyComponentFinderFinder; $files = Finder::create() ->depth(0) ->depth(>1) ->depth(<3) ->in(__DIR__); domingo 17 de junio de 12
  • 24. buscando sólo archivos use SymfonyComponentFinderFinder; $files = Finder::create() ->files() ->in(__DIR__); domingo 17 de junio de 12
  • 25. buscando sólo directorios use SymfonyComponentFinderFinder; $files = Finder::create() ->directories() ->in(__DIR__); domingo 17 de junio de 12
  • 26. obteniendo un resultado ordenado use SymfonyComponentFinderFinder; $files = Finder::create() ->sortByName() ->sortByType() ->sort( function(SplFileInfo $file1, SplFileInfo $file2){ return $file1->getSize() > $file2->getSize(); } ) ->in(__DIR__); domingo 17 de junio de 12
  • 27. archivos php en la carpeta raíz del proyecto use SymfonyComponentFinderFinder; $files = Finder::create() ->files() ->depth(0) ->name("*.php") ->in(__DIR__); domingo 17 de junio de 12
  • 28. Process domingo 17 de junio de 12
  • 29. Facilita la ejecución de comandos del sistema domingo 17 de junio de 12
  • 30. ¿está Twitter online? use SymfonyComponentProcessProcess; $process = new Process('ping -c 1 twitter.com'); $process->run(); if($process->isSuccessful()){ print "Twitter esta online"; }else{ print "Twitter esta offline"; } domingo 17 de junio de 12
  • 31. ping -c 4 twitter.com domingo 17 de junio de 12
  • 32. calculando tiempos medios de respuesta $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 está offline"; } domingo 17 de junio de 12
  • 33. Validator domingo 17 de junio de 12
  • 34. Ayuda a validar tanto variables como objetos domingo 17 de junio de 12
  • 35. Validando que un valor sea no nulo use SymfonyComponentValidatorConstraintsNotNull; use SymfonyComponentValidatorConstraintsNotNullValidator; $validator = new NotNullValidator(); if(!$validator->isValid(null, new NotNull())) { print $validator->getMessageTemplate(); // "The value should not be null" } domingo 17 de junio de 12
  • 36. 24 Validadores 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 17 de junio de 12
  • 37. Usando la clase Validator 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 17 de junio de 12
  • 38. Validando un objeto (PHP) class Person { public $name; public $age; } $name no puede ser una cadena vacía $age deberán ser un número comprendido entre 18 y 99 años domingo 17 de junio de 12
  • 39. Validando un objeto (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 17 de junio de 12
  • 40. Validando un objeto (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 17 de junio de 12
  • 41. Validando un objeto (YAML) class Person { public $name; public $age; } $name no puede ser una cadena vacía $age deberán ser un número comprendido entre 18 y 99 años domingo 17 de junio de 12
  • 42. Validando un objeto (YAML) # validate.yml Person: properties: name: - NotBlank : ~ age: - Min: 18 - Max: 99 domingo 17 de junio de 12
  • 43. Validando un objeto (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 17 de junio de 12
  • 45. Cuando todo es un array domingo 17 de junio de 12
  • 46. Objeto denormalize normalize deserialize serialize Array encode decode Formato (JSON, XML) domingo 17 de junio de 12
  • 47. Serializando un objeto class Person {   private $age;   private $name; public function getName()   {     return $this->name;   }   public function getAge()   {     return $this->age;   }   public function setName($name)   {     $this->name = $name;   }   public function setAge($age)   {     $this->age = $age;   } } domingo 17 de junio de 12
  • 48. Serializando un objeto use SymfonyComponentSerializerSerializer; use SymfonyComponentSerializerEncoderXmlEncoder; use SymfonyComponentSerializerEncoderJsonEncoder; use SymfonyComponentSerializerNormalizerGetSetMethodNormalizer; $person = new Person(19, 'Javi'); $encoders = array(new XmlEncoder(), new JsonEncoder() ); $normalizers = array(new GetSetMethodNormalizer()); $serializer = new Serializer($normalizers, $encoders); $serializer->serialize($person, 'json');// {"name":"Javi","age":19} domingo 17 de junio de 12
  • 49. Deserializando un objeto data = <<<EOF <person>   <name>Javi</name>   <age>19</age> </person> EOF; $person = $serializer->deserialize($data,'Person','xml'); domingo 17 de junio de 12
  • 50. Console domingo 17 de junio de 12
  • 51. Facilita la creación de tareas repetitivas domingo 17 de junio de 12
  • 52. La consola más sencilla // console.php use SymfonyComponentConsoleApplication; $console = new Application(); $console->run(); domingo 17 de junio de 12
  • 53. php console.php domingo 17 de junio de 12
  • 54. php console.php help domingo 17 de junio de 12
  • 55. php console.php help list domingo 17 de junio de 12
  • 56. Hola mundo ... para consolas use SymfonyComponentConsoleApplication; use SymfonyComponentConsoleInputInputArgument; $console = new Application(); $console ->register('hello') ->setDefinition(array( new InputArgument('name', InputArgument::REQUIRED, 'Nombre'), )) ->setDescription('Saluda a una persona') ->setCode(function ($input, $output) { $name = $input->getArgument('name'); $output->writeln(sprintf('Hola <info>%s</info>', $name)); }) ; $console->run(); domingo 17 de junio de 12
  • 57. Hay una manera mejor de hacerlo, Command domingo 17 de junio de 12
  • 58. Creando un nuevo comando use SymfonyComponentConsoleCommandCommand; use SymfonyComponentConsoleInputInputArgument; class HelloCommand extends Command { public function configure() { $this->setName('hello'); $this->setDefinition(array( new InputArgument('name', InputArgument::REQUIRED, 'Nombre'), )) $this->setDescription('Saluda a una persona') } public function execute($input, $output) { $name = $input->getArgument('name'); $output->writeln(sprintf('Hola <info>%s</info>', $name)); } } domingo 17 de junio de 12
  • 59. Creando un nuevo comando use SymfonyComponentConsoleApplication; $console = new Application(); $console->add(new HelloCommand()); $console->run(); domingo 17 de junio de 12
  • 60. Antes de irme domingo 17 de junio de 12
  • 61. Divide y vencerás domingo 17 de junio de 12
  • 62. Los tests son una excelente documentación domingo 17 de junio de 12
  • 63. Check it out! http://github.com:loalf/Sf2ComponentsPlayground.git domingo 17 de junio de 12
  • 64. Gracias @loalf IPC Media está reclutando, búscame si estás pensando en mudarte a Londres Créditos: http://www.flickr.com/photos/normalityrelief/3075723695/ domingo 17 de junio de 12