#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

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.
  • 5.
  • 6.
    Son un conjuntode 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
  • 9.
  • 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 dejunio de 12
  • 14.
    Parsea y generaarchivos 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.
  • 19.
    Herramienta para encontrararchivos y directorios domingo 17 de junio de 12
  • 20.
    buscando archivos pornombre 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 portamañ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 porfecha 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 nivelde 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 resultadoordenado 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 enla carpeta raíz del proyecto use SymfonyComponentFinderFinder; $files = Finder::create() ->files() ->depth(0) ->name("*.php") ->in(__DIR__); domingo 17 de junio de 12
  • 28.
  • 29.
    Facilita la ejecuciónde 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 4twitter.com domingo 17 de junio de 12
  • 32.
    calculando tiempos mediosde 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.
  • 34.
    Ayuda a validartanto variables como objetos domingo 17 de junio de 12
  • 35.
    Validando que unvalor 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 claseValidator 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
  • 44.
  • 45.
    Cuando todo esun 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.
  • 51.
    Facilita la creaciónde tareas repetitivas domingo 17 de junio de 12
  • 52.
    La consola mássencilla // console.php use SymfonyComponentConsoleApplication; $console = new Application(); $console->run(); domingo 17 de junio de 12
  • 53.
  • 54.
  • 55.
    php console.php helplist 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 maneramejor de hacerlo, Command domingo 17 de junio de 12
  • 58.
    Creando un nuevocomando 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 nuevocomando use SymfonyComponentConsoleApplication; $console = new Application(); $console->add(new HelloCommand()); $console->run(); domingo 17 de junio de 12
  • 60.
    Antes de irme domingo17 de junio de 12
  • 61.
    Divide y vencerás domingo17 de junio de 12
  • 62.
    Los tests sonuna 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