Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Componentes, el arma secreta de Symfony2

3,249 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Componentes, el arma secreta de Symfony2

  1. 1. #deSymfony Javier López | @loalfdomingo 17 de junio de 12
  2. 2. #deSymfony Javier López | @loalfdomingo 17 de junio de 12
  3. 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/loalfdomingo 17 de junio de 12
  4. 4. Los componentesdomingo 17 de junio de 12
  5. 5. http://fabien.potencier.org/article/49/what-is-symfony2domingo 17 de junio de 12
  6. 6. Son un conjunto de librerías autónomas, desacopladas y complementarias que resuelven problemas comunes del desarrollo webdomingo 17 de junio de 12
  7. 7. 22 Componentes EventDispatcher Validator Browserkit ClassLoader Routing HttpFoundation Filesystem Finder DependencyInjection Config Security Console CssSelector Locale Translation Form DomCrawler HttpKernel Yaml Serializer Process Templatingdomingo 17 de junio de 12
  8. 8. 22 Componentes EventDispatcher Validator Browserkit ClassLoader Routing HttpFoundation Filesystem Finder DependencyInjection Config Security Console CssSelector Locale Translation Form DomCrawler HttpKernel Yaml Serializer Process Templatingdomingo 17 de junio de 12
  9. 9. Instalacióndomingo 17 de junio de 12
  10. 10. mkdir ComponentsPlayground cd ComponentsPlayground mkdir vendor cd vendor git clone https://github.com/symfony/symfonydomingo 17 de junio de 12
  11. 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. 12. ejemplo.php <?php require_once autoload.php; /* * Código del ejemplo */ > php ejemplo.phpdomingo 17 de junio de 12
  13. 13. Yamldomingo 17 de junio de 12
  14. 14. Parsea y genera archivos ymldomingo 17 de junio de 12
  15. 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. 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. 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. 18. Finderdomingo 17 de junio de 12
  19. 19. Herramienta para encontrar archivos y directoriosdomingo 17 de junio de 12
  20. 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. 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^3domingo 17 de junio de 12
  22. 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. 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. 24. buscando sólo archivos use SymfonyComponentFinderFinder; $files = Finder::create() ->files() ->in(__DIR__);domingo 17 de junio de 12
  25. 25. buscando sólo directorios use SymfonyComponentFinderFinder; $files = Finder::create() ->directories() ->in(__DIR__);domingo 17 de junio de 12
  26. 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. 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. 28. Processdomingo 17 de junio de 12
  29. 29. Facilita la ejecución de comandos del sistemadomingo 17 de junio de 12
  30. 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. 31. ping -c 4 twitter.comdomingo 17 de junio de 12
  32. 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. 33. Validatordomingo 17 de junio de 12
  34. 34. Ayuda a validar tanto variables como objetosdomingo 17 de junio de 12
  35. 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. 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 Callbackdomingo 17 de junio de 12
  37. 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; } ConstraintViolationListdomingo 17 de junio de 12
  38. 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ñosdomingo 17 de junio de 12
  39. 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. 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. 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ñosdomingo 17 de junio de 12
  42. 42. Validando un objeto (YAML) # validate.yml Person: properties: name: - NotBlank : ~ age: - Min: 18 - Max: 99domingo 17 de junio de 12
  43. 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. 44. Serializerdomingo 17 de junio de 12
  45. 45. Cuando todo es un arraydomingo 17 de junio de 12
  46. 46. Objeto denormalize normalize deserialize serialize Array encode decode Formato (JSON, XML)domingo 17 de junio de 12
  47. 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. 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. 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. 50. Consoledomingo 17 de junio de 12
  51. 51. Facilita la creación de tareas repetitivasdomingo 17 de junio de 12
  52. 52. La consola más sencilla // console.php use SymfonyComponentConsoleApplication; $console = new Application(); $console->run();domingo 17 de junio de 12
  53. 53. php console.phpdomingo 17 de junio de 12
  54. 54. php console.php helpdomingo 17 de junio de 12
  55. 55. php console.php help listdomingo 17 de junio de 12
  56. 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. 57. Hay una manera mejor de hacerlo, Commanddomingo 17 de junio de 12
  58. 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. 59. Creando un nuevo comando use SymfonyComponentConsoleApplication; $console = new Application(); $console->add(new HelloCommand()); $console->run();domingo 17 de junio de 12
  60. 60. Antes de irmedomingo 17 de junio de 12
  61. 61. Divide y vencerásdomingo 17 de junio de 12
  62. 62. Los tests son una excelente documentacióndomingo 17 de junio de 12
  63. 63. Check it out! http://github.com:loalf/Sf2ComponentsPlayground.gitdomingo 17 de junio de 12
  64. 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

×