SlideShare una empresa de Scribd logo
1 de 64
Descargar para leer sin conexión
#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

Más contenido relacionado

La actualidad más candente

Primitive Obsession. FrontFest 2020
Primitive Obsession. FrontFest 2020Primitive Obsession. FrontFest 2020
Primitive Obsession. FrontFest 2020Aida Albarrán
 
Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaAgencia INNN
 
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 2014Pablo Alba
 
Programa de arbol
Programa  de arbol Programa  de arbol
Programa de arbol zxxsasukexxz
 
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 DBRoman Herrera
 
Práctico de variables
Práctico de variablesPráctico de variables
Práctico de variablesPablo Macon
 
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 2016Agencia INNN
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controllerhydras_cs
 
Manejo de archivos en java
Manejo de archivos en javaManejo de archivos en java
Manejo de archivos en javaMaiirOn Gaitan
 
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 conocerGeek Advisor Freddy
 

La actualidad más candente (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
 

Similar a Componentes, el arma secreta de Symfony2

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 pasosJavier Eguiluz
 
Un newbie conoce a Sinatra
Un newbie conoce a SinatraUn newbie conoce a Sinatra
Un newbie conoce a SinatraJano González
 
PowerShell para administradores
PowerShell para administradoresPowerShell para administradores
PowerShell para administradoresPablo Campos
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Raul Fraile
 
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ñaDroidcon Spain
 
Fundamento de poo en php
Fundamento de poo en phpFundamento de poo en php
Fundamento de poo en phpRobert Moreira
 
Introducción a phone gap
Introducción a phone gapIntroducción a phone gap
Introducción a phone gapRodrigo Corral
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQueryDanae Aguilar Guzmán
 
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 JVMjavier ramirez
 
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 rmiTerryJoss
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Ricard Luquero
 

Similar a 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!
 

Más de Javier López

Continous Delivering a PHP application
Continous Delivering a PHP applicationContinous Delivering a PHP application
Continous Delivering a PHP applicationJavier López
 
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.Javier López
 
Slides changes symfony23
Slides changes symfony23Slides changes symfony23
Slides changes symfony23Javier López
 
Novedades en Symfony 2.3
Novedades en Symfony 2.3Novedades en Symfony 2.3
Novedades en Symfony 2.3Javier López
 
Shifting gears with Composer
Shifting gears with ComposerShifting gears with Composer
Shifting gears with ComposerJavier López
 
Symfony y Admin Generator
Symfony y Admin GeneratorSymfony y Admin Generator
Symfony y Admin GeneratorJavier López
 

Más de 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
 

Último

TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfTENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfJoseAlejandroPerezBa
 
La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2montoyagabriela340
 
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...RaymondCode
 
Análisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfAnálisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfcastrodanna185
 
Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.marianarodriguezc797
 
Matriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxMatriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxPaolaCarolinaCarvaja
 
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfActividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfalejandrogomezescoto
 
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosEl diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosLCristinaForchue
 
La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....Aaron Betancourt
 
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfInmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfOBr.global
 
Inteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidadInteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidaddanik1023m
 
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...OLGAMILENAMONTAEZNIO
 
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSPRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSLincangoKevin
 
Carta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfCarta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfangelinebocanegra1
 
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfPresentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfymiranda2
 
Los mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfLos mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfodalistar77
 
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETDe Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETGermán Küber
 
VIDEOS DE APOYO.docx E
VIDEOS DE APOYO.docx                                  EVIDEOS DE APOYO.docx                                  E
VIDEOS DE APOYO.docx Emialexsolar
 

Último (20)

TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfTENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
 
La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2
 
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
 
Análisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfAnálisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdf
 
Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.
 
Matriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxMatriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docx
 
BEDEC Proyecto y obra , novedades 2024 - Xavier Folch
BEDEC Proyecto y obra , novedades 2024 - Xavier FolchBEDEC Proyecto y obra , novedades 2024 - Xavier Folch
BEDEC Proyecto y obra , novedades 2024 - Xavier Folch
 
BEDEC Sostenibilidad, novedades 2024 - Laura Silva
BEDEC Sostenibilidad, novedades 2024 - Laura SilvaBEDEC Sostenibilidad, novedades 2024 - Laura Silva
BEDEC Sostenibilidad, novedades 2024 - Laura Silva
 
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfActividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
 
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosEl diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
 
La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....
 
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfInmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
 
Inteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidadInteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidad
 
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
 
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSPRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
 
Carta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfCarta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdf
 
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfPresentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
 
Los mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfLos mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdf
 
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETDe Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
 
VIDEOS DE APOYO.docx E
VIDEOS DE APOYO.docx                                  EVIDEOS DE APOYO.docx                                  E
VIDEOS DE APOYO.docx E
 

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