Slides components en

1,252 views
1,162 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,252
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Slides components en

  1. 1. Components Symfony’s secret weapon Javier López | @loalfdomingo 27 de noviembre de 11
  2. 2. The componentsdomingo 27 de noviembre de 11
  3. 3. The components are a set of standalone, decoupled and cohesive PHP libraries that solve common web development problems.domingo 27 de noviembre de 11
  4. 4. 21 Components Browserkit EventDispatcher Security ClassLoader Routing HttpFoundation Finder DependencyInjection Config Console CssSelector Locale Form DomCrawler HttpKernel Serializer Process Templating Yaml Validator Translationdomingo 27 de noviembre de 11
  5. 5. 21 Components Browserkit EventDispatcher Security ClassLoader Routing HttpFoundation Finder DependencyInjection Config Console CssSelector Locale Form DomCrawler HttpKernel Serializer Process Templating Yaml Validator Translationdomingo 27 de noviembre de 11
  6. 6. Installingdomingo 27 de noviembre de 11
  7. 7. mkdir ComponentPlayground cd ComponentPlayground mkdir vendor cd vendor git clone https://github.com/symfony/symfonydomingo 27 de noviembre de 11
  8. 8. downloaddomingo 27 de noviembre de 11
  9. 9. autoload.php <?php require_once __DIR__./vendor/symfony/src/Symfony/Component/ ClassLoader/UniversalClassLoader.php; use SymfonyComponentClassLoaderUniversalClassLoader; $loader = new UniversalClassLoader(); $loader->registerNamespaces(array( Symfony => __DIR__./vendor/symfony/src, )); $loader->register();domingo 27 de noviembre de 11
  10. 10. sample.php <?php require_once autoload.php; /* * Sample code */ > php sample.phpdomingo 27 de noviembre de 11
  11. 11. Yamldomingo 27 de noviembre de 11
  12. 12. Parsing and generating YAML filesdomingo 27 de noviembre de 11
  13. 13. parsing YAML files use SymfonyComponentYamlYaml; #example.yml $data = Yaml::parse(example.yml); description: “Users of Symfony” users: print $data[description]; javi: name: “Javi” foreach( $data[users] as $user) surname: “López” { rob: print $user[name] name: “Rob” . . surname: “Waring” $user[surname]; }domingo 27 de noviembre de 11
  14. 14. generating YAML files use SymfonyComponentYamlYaml; $data[description] = "Symfony Users” $data[users][] = array( description: “Symfony users” name => Javi, users: surname => Lopez 0: ); name: “Javi” surname: “López” $data[users][] = array( 1: name => Rob, name: “Rob” surname => Waring surname: “Waring” ); print Yaml::dump($data);domingo 27 de noviembre de 11
  15. 15. YAML & PHP #example.yml generated: <?php echo date(‘Y’); ?> use SymfonyComponentYamlYaml; description: “Users of Symfony” users: Yaml::enablePhpParsing(); javi: name: “Javi” $data = Yaml::parse(example.yml); surname: “López” rob: print $data[generated]; name: “Rob” surname: “Waring”domingo 27 de noviembre de 11
  16. 16. Finderdomingo 27 de noviembre de 11
  17. 17. Finding files and directories the easy waydomingo 27 de noviembre de 11
  18. 18. finding by name use SymfonyComponentFinderFinder; $files = Finder::create() ->name("*.php") ->name("*.{php,yml}") ->name("/.(php|yml)$/") ->name("/^w{3,10}$/") ->name("foo.php") ->in(__DIR__); Referencia sobre Patrones Glob: http://cowburn.info/2010/04/30/glob-patterns/domingo 27 de noviembre de 11
  19. 19. finding by size use SymfonyComponentFinderFinder; $files = Finder::create() ->size("> 10k") ->size("<= 4mi") ->size("2gi") ->in(__DIR__); k = 1000 ki = 1024 m = 1000^2 mi = 1024^2 g = 1000^3 gi = 1024^3domingo 27 de noviembre de 11
  20. 20. finding by date use SymfonyComponentFinderFinder; $files = Finder::create() ->date("since yesterday") ->date("until 2 days ago") ->date("> now - 2 hours") ->date(">= 2005-10-15 ") ->in(__DIR__); Every parameter valid to strtotime()domingo 27 de noviembre de 11
  21. 21. fixing the depth use SymfonyComponentFinderFinder; $files = Finder::create() ->depth(0) ->depth(>1) ->depth(<3) ->in(__DIR__);domingo 27 de noviembre de 11
  22. 22. just files use SymfonyComponentFinderFinder; $files = Finder::create() ->files() ->in(__DIR__);domingo 27 de noviembre de 11
  23. 23. just directories use SymfonyComponentFinderFinder; $files = Finder::create() ->directories() ->in(__DIR__);domingo 27 de noviembre de 11
  24. 24. sorting use SymfonyComponentFinderFinder; $files = Finder::create() ->sortByName() ->sortByType() ->sort( function(SplFileInfo $file1, SplFileInfo $file2){ return $file1->getSize() > $file2->getSize(); } ) ->in(__DIR__);domingo 27 de noviembre de 11
  25. 25. php files in the project root directory use SymfonyComponentFinderFinder; $files = Finder::create() ->files() ->depth(0) ->name("*.php") ->in(__DIR__);domingo 27 de noviembre de 11
  26. 26. images in Amazon S3 $s3 = new Zend_Service_Amazon_S3($key, $secret); $s3->registerStreamWrapper("s3"); $files = Finder::create() ->name(*.{jpg,jpeg,png,gif}) ->size(< 100K) ->date(since 1 hour ago) ->in(s3://bucket-name);domingo 27 de noviembre de 11
  27. 27. Processdomingo 27 de noviembre de 11
  28. 28. Easening command system executiondomingo 27 de noviembre de 11
  29. 29. Is Twitter online? use SymfonyComponentProcessProcess; $process = new Process(ping -c 1 twitter.com); $process->run(); if($process->isSuccessful()){ print "Twitter is online"; }else{ print "Twitter is offline"; }domingo 27 de noviembre de 11
  30. 30. ping -c 4 twitter.comdomingo 27 de noviembre de 11
  31. 31. showing the average time $process = new Process(ping -c 4 twitter.com); $process->run(); if($process->isSuccessful()) { $output = $process->getOutput(); $pattern = /time=(d+.d+) ms/; preg_match_all($pattern, $output, $matches); $average = array_sum($matches[1])/count($matches[1]); printf("Avergage time=%.3f ms", $average); }else{ print "Twitter is offline"; }domingo 27 de noviembre de 11
  32. 32. showing just the time use SymfonyComponentProcessProcess; $process = new Process(ping -c 4 twitter.com); $process->run(function($type, $buffer) { if(out === $type){ $pattern = /time=(d+.d+) ms/; if(preg_match_all($pattern, $buffer, $matches)){; print $matches[0][0]."n"; } }elseif( err === $type ){ print "Twitter is offline"; } });domingo 27 de noviembre de 11
  33. 33. DomCrawlerdomingo 27 de noviembre de 11
  34. 34. extracting information from the DOMdomingo 27 de noviembre de 11
  35. 35. Twitter search use SymfonyComponentDomCrawlerCrawler; $uri = http://search.twitter.com/search.atom?q=symfony2; $crawler = new Crawler(); $content = file_get_contents($uri); $crawler->addXmlContent($content); foreach($crawler->filterXpath(//content) as $node) { print $node->nodeValue; }domingo 27 de noviembre de 11
  36. 36. Symfony.com blog posts use SymfonyComponentDomCrawlerCrawler; $uri = http://symfony.com/blog; $content = file_get_contents($uri); $crawler = new Crawler($content, $uri); $nodes = $crawler->filterXPath(//div[@class="box_article"]//a); foreach($nodes->links() as $link) { print $link->getUri(); }domingo 27 de noviembre de 11
  37. 37. CssSelectordomingo 27 de noviembre de 11
  38. 38. CSS Selector => XPath expressionsdomingo 27 de noviembre de 11
  39. 39. from CSS to XPath use SymfonyComponentCssSelectorCssSelector; print CssSelector::toXPath(div.box_article a); /* * descendant-or-self::div[ * contains( * concat( , normalize- space(@class), ), * box_article * ) * ]/descendant::a */domingo 27 de noviembre de 11
  40. 40. Symfony.com blog posts use SymfonyComponentDomCrawlerCrawler; $uri = http://symfony.com/blog; $content = file_get_contents($uri); $crawler = new Crawler($content, $uri); $nodes = $crawler->filter(div.box_article a);domingo 27 de noviembre de 11
  41. 41. Templatingdomingo 27 de noviembre de 11
  42. 42. A simple and easy template enginedomingo 27 de noviembre de 11
  43. 43. 4 wordsdomingo 27 de noviembre de 11
  44. 44. Loader: finds a templatedomingo 27 de noviembre de 11
  45. 45. NameParser: converts templates name to templates objectsdomingo 27 de noviembre de 11
  46. 46. Engine: renders templatesdomingo 27 de noviembre de 11
  47. 47. Helpers: adds extra functionalitydomingo 27 de noviembre de 11
  48. 48. A simple example // __DIR__/templates/index.php <?php echo $name; ?>domingo 27 de noviembre de 11
  49. 49. A simple example use SymfonyComponentTemplatingLoaderFilesystemLoader; use SymfonyComponentTemplatingPhpEngine; use SymfonyComponentTemplatingTemplateNameParser; $loader = new FilesystemLoader( array(__DIR__./templates/%name%.php) ); $parser = new TemplateNameParser(); $engine = new PhpEngine($parser, $loader); echo $engine->render(index, array(name => Javi));domingo 27 de noviembre de 11
  50. 50. Inheritance // __DIR__/templates/layout.php <div id="header"> <h1>Cabecera</h1> </div> <div id="content"> <?php echo $view[slots]->get(_content); ?> </div> <div id="footer"> <p>Pie</p> </div>domingo 27 de noviembre de 11
  51. 51. Inheritance // __DIR__/templates/index.php <?php echo $view->extend(layout); ?> <p> <?php echo $name; ?> </p>domingo 27 de noviembre de 11
  52. 52. Inheritance use SymfonyComponentTemplatingHelperSlotsHelper; $loader = new FilesystemLoader( array(__DIR__./templates/%name%.php) ); $parser = new TemplateNameParser(); $engine = new PhpEngine($parser, $loader, new SlotsHelper()); echo $engine->render(index, array(name => Javi));domingo 27 de noviembre de 11
  53. 53. Inheritance <div id="header"> <h1>Cabecera</h1> </div> <div id="content"> <p>Javi</p> </div> <div id="footer"> <p>Pie</p> </div>domingo 27 de noviembre de 11
  54. 54. and many more ... ... slots ... global variables ... escaping ... assets managment ... cachedomingo 27 de noviembre de 11
  55. 55. Validatordomingo 27 de noviembre de 11
  56. 56. asserting variable or object valuesdomingo 27 de noviembre de 11
  57. 57. Validating a value is not null use SymfonyComponentValidatorConstraintsNotNull; use SymfonyComponentValidatorConstraintsNotNullValidator; $validator = new NotNullValidator(); if(!$validator->isValid(null, new NotNull())) { print $validator->getMessageTemplate(); // "The value should not be null" }domingo 27 de noviembre de 11
  58. 58. 24 Validators Blank Max Date NotBlank Min Time Null Url DateTime NotNull Email Locale True IP Language False File Country Choice Image Collection Type Size Callbackdomingo 27 de noviembre de 11
  59. 59. Using the Validator service use SymfonyComponentValidatorValidator; use SymfonyComponentValidatorConstraintValidatorFactory; use SymfonyComponentValidatorMappingBlackholeMetadataFactory; use SymfonyComponentValidatorConstraints as Asserts; $validator = new Validator( new BlackholeMetadataFactory, new ConstraintValidatorFactory ); $errors = $validator->validateValue(, new AssertsNotBlank()); if($errors->count()) { print $errors; } ConstraintViolationListdomingo 27 de noviembre de 11
  60. 60. Validando un objeto (PHP) class Person { public $name; public $age; } $name must not be empty $age must be a number between 18 and 99domingo 27 de noviembre de 11
  61. 61. Validating an object (PHP) use SymfonyComponentValidatorValidator; use SymfonyComponentValidatorConstraintValidatorFactory; use SymfonyComponentValidatorMappingClassMetadataFactory; use SymfonyComponentValidatorMappingLoaderStaticMethodLoader; $validator = new Validator( new ClassMetadataFactory(new StaticMethodLoader() ), new ConstraintValidatorFactory() ); $person = new Person(); $errors = $validator->validate($person);domingo 27 de noviembre de 11
  62. 62. Validating an object (PHP) use SymfonyComponentValidatorMappingClassMetadata; use SymfonyComponentValidatorConstraint as Asserts; class Person { public $name; public $age; static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata ->addPropertyConstraint(name, new AssertsNotBlank()) ->addPropertyConstraint(age , new AssertsMin(18)); ->addPropertyConstraint(age , new AssertsMax(99)); } }domingo 27 de noviembre de 11
  63. 63. Validando un objeto (YAML) class Person { public $name; public $age; } $name must not be empty $age must be a number between 18 and 99domingo 27 de noviembre de 11
  64. 64. Validating an object (YAML) # validate.yml Person: properties: name: - NotBlank : ~ age: - Min: 18 - Max: 99domingo 27 de noviembre de 11
  65. 65. Validating an object (YAML) use SymfonyComponentValidatorValidator; use SymfonyComponentValidatorConstraintValidatorFactory; use SymfonyComponentValidatorMappingClassMetadataFactory; use SymfonyComponentValidatorMappingLoaderYamlFileLoader; $validator = new Validator( new ClassMetadataFactory( new YamlFileLoader(__DIR__./validate.yml) ), new ConstraintValidatorFactory() ); $person = new Person(); $errors = $validator->validate($person);domingo 27 de noviembre de 11
  66. 66. Consoledomingo 27 de noviembre de 11
  67. 67. Creating repetive tasksdomingo 27 de noviembre de 11
  68. 68. The easiest console ever // console.php use SymfonyComponentConsoleApplication; $console = new Application(); $console->run();domingo 27 de noviembre de 11
  69. 69. php console.phpdomingo 27 de noviembre de 11
  70. 70. php console.php helpdomingo 27 de noviembre de 11
  71. 71. php console.php help listdomingo 27 de noviembre de 11
  72. 72. Hello World ... for consoles use SymfonyComponentConsoleApplication; use SymfonyComponentConsoleInputInputArgument; $console = new Application(); $console ->register(hello) ->setDefinition(array( new InputArgument(name, InputArgument::REQUIRED, Name), )) ->setDescription(It says hello to a person) ->setCode(function ($input, $output) { $name = $input->getArgument(name); $output->writeln(sprintf(Hello <info>%s</info>, $name)); }) ; $console->run();domingo 27 de noviembre de 11
  73. 73. There is a better way to do it, Commanddomingo 27 de noviembre de 11
  74. 74. Creating a new command use SymfonyComponentConsoleCommandCommand; use SymfonyComponentConsoleInputInputArgument; class HelloCommand extends Command { public function configure() { $this->setName(hello); $this->setDefinition(array( new InputArgument(name, InputArgument::REQUIRED, Name), )) $this->setDescription(Say hello to a person) } public function execute($input, $output) { $name = $input->getArgument(name); $output->writeln(sprintf(Hello <info>%s</info>, $name)); } }domingo 27 de noviembre de 11
  75. 75. Creating a new command use SymfonyComponentConsoleApplication; $console = new Application(); $console->add(new HelloCommand()); $console->run();domingo 27 de noviembre de 11
  76. 76. Thanks @loalf Créditos: http://www.flickr.com/photos/normalityrelief/3075723695/domingo 27 de noviembre de 11

×