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.

Levate l'ancora! Rotte senza problemi con ZF2

2,056 views

Published on

Introduzione al routing di Zend Framework 2, tenuta allo Zend Framework Day del 01/02/2013 a Milano.

Avere URL pulite e ben strutturate è molto importante, sia da un punto di vista SEO, che di organizzazione delle proprie API. In Zend Framework 2 è il router ad occuparsi di gestire le richieste http, di delegare l'esecuzione delle stesse all'opportuno frammento di codice sorgente, e quindi di estrarne gli eventuali parametri. Questo talk introduce le potenti funzionalità del nuovo sistema di routing di ZF2. Grazie a esempi reali (con gestione di richiestte http, ma anche CLI), sarete in grado di utilizzare il nuovo router di ZF2 in tutta la sua flessibilità.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Levate l'ancora! Rotte senza problemi con ZF2

  1. 1. Levate lancora! Rotte senza problemi con ZF2Zend Framework DAY, Milano - Italia 01-02-2013
  2. 2. Diego Drigani
  3. 3. @drigani
  4. 4. http://www.mvassociati.it/
  5. 5. http://friuli.grusp.org/
  6. 6. COS’È IL ROUTING?
  7. 7. Partiamo da una richiesta http://sales.it/products/smartphones
  8. 8. Principio fondamentale di routing• Matching di una richiesta ed estrazione dei parametri• Assembling di nuove richieste
  9. 9. Under the hoodnamespace ZendMvcRouter;use ZendStdlibRequestInterface as Request;interface RouteInterface{ public static function factory($options = array()); public function match(Request $request); public function assemble( array $params = array(), array $options = array());}
  10. 10. PERCHÈ IL ROUTING È IMPORTANTE?
  11. 11. USER FRIENDLY URL
  12. 12. SEO FRIENDLY URL
  13. 13. MAGGIOR SICUREZZA
  14. 14. RESTFUL SERVICES API
  15. 15. TIPI DI ROTTE
  16. 16. Richiesta http://www.zfday.it/about-us http://www.zfday.it/about-us16
  17. 17. Literal route • Il più semplice • Fa il matching/assembling letterale di una stringa • Non fa matching di alcun parametro17
  18. 18. Literal route (esempio)array( about => array( type => Literal, options => array( route => /about-us, defaults => array( controller => Pages, action => about-us, ) ) ))
  19. 19. Richiesta http://www.hubme.in/get/events.rss http://www.hubme.in/get/events.rss http://www.hubme.in/get/cfps.atom19
  20. 20. Regex route • Il tipo di rotta parameter-matching più veloce • Il matching basato su regexp • Fa l’assembling sulla base di un replacement pattern20
  21. 21. Regex route (esempio)array( get => array( type => Regex, options => array( regex=> /* Definizione di Named Sub patterns, ad es: ?<type> e ?<format> */ /get/(?<type>(events|cfps))(.(?<format>(atom|rss)))?, defaults => array( controller => Api, action => get, ), //Usato al momento dell’assemble spec => /get/%type%.%format%, ) ))
  22. 22. Richiesta http://sale.it/catalog?brand=epson&priceto=20 0 http://sale.it/catalog?brand=epson&priceto=20022
  23. 23. Query route • Consente di specificare e catturare parametri della query string • L’idea è che venga usata come child_route di un’altra rotta.23
  24. 24. Query route (esempio)array( //... catalog_query => array( type => Query ))
  25. 25. Richiesta http://sale.it/catalog http://sale.it/catalog http://sale.it/catalog/electronics http://sale.it/catalog/electronics http://sale.it/catalog/electronics/smartphones http://sale.it/catalog/electronics/smartphones25
  26. 26. Segment route • Il tipo più flessibile • Matching molto veloce, giacchè i segment patterns sono internamente convertiti in regexp • Fornisce il matching dei parametri basato su delimeters e constraints • Consente segmenti opzionali (letterali e segmenti)26
  27. 27. Segment route (esempio)array( catalog => array( type => Segment, options => array( route => /catalog[/:category[/:subcategory]], constraints => array( ‘category‘ => [a-zA-Z][a-zA-Z0-9._-]*, ‘subcategory => [a-zA-Z][a-zA-Z0-9._-]*, ), defaults => array( controller => Catalog, action => index, ) ) ))
  28. 28. Struttura segment patterns • I segmenti opzionali – Sono indicati tra parentesi quadre – Possono essere annidati – Possono contenere letterali e parametri • Il delimitatore di default per i parametri è la barra, ma può essere modificato con parentesi graffe28
  29. 29. Segment patterns (esempio) • /events[/page-:id] – Matches: • /events • /events/page-129
  30. 30. Segment patterns (esempio) • /events/[page-:id] – Matches: • /events/ • /events/page-130
  31. 31. Combinando alcune rottearray( catalog => array( type => Literal, options => array( route => /catalog, defaults => array( controller => Catalog, action => index, ) ), may_terminate => true, child_routes => array( category => array( type => Segment, options => array( route => /:category, //... ) ) ) …
  32. 32. TIPI AVANZATI DI ROTTE
  33. 33. Matching fuori dal path • Hostname route – :user.users.cpanel.it • diego.users.cpanel.it • Scheme route – http, https, ... • Method route – GET, POST, PUT, ...33
  34. 34. ROUTING NELLE APPLICAZIONI
  35. 35. Definizione delle rotte//module.config.phpreturn array( router => array( routes => array( // ... ) ));
  36. 36. I parametri dal controllerclass ZfdayController extends AbstractActionController{ public function indexAction() { $id = $this->params(id/*, null */); }}
  37. 37. Redirectclass ZfdayController extends AbstractActionController{ public function indexAction() { $this->redirect()->toRoute( routeName, array(), // Params array() // Options ); }}
  38. 38. Assembling URLs nel controllerclass ZfdayController extends AbstractActionController{ public function indexAction() { $url = $this->url()->fromRoute( routeName, array(), // Params array() // Options ); $this->redirect()->toUrl($url . #anchorName); }}
  39. 39. Assembling URLs nella view<a href="<?php echo $this->url( routeName, array(), // Params array() // Options );?>">Some Link</a>
  40. 40. APPLICAZIONI CLI E ROUTING
  41. 41. Introduzione console routing • ZF2 ha una integrazione nativa del MVC con la console • Permette di individuare controller e action da eseguire a partire da un comando della console • Le action sono eseguite e il risultato è mostrato nella console41
  42. 42. Boostrapping ZF2Create file: bin/ecommerce-console#!/usr/bin/php<?phpinclude __DIR__./../public/index.php;
  43. 43. CLI: controller esempioclass ProductsController extends AbstractActionController { public function importAction() { $request = $this->getRequest(); if (!$request instanceof ZendConsoleRequest){ throw new RuntimeException(only from console!); } //do products import return Import done!; } public function updateAction() { //do products update prices and stocks return Update done!; }}
  44. 44. Definizione: console routingarray( router => array( routes => array( // HTTP routes are defined here ) ), console => array( router => array( routes => array( // Console routes go here ) ) ))
  45. 45. CLI Routing: esempioarray( console => array( router => array( routes => array( command_import => array( type => simple, options => array( route => import, defaults => array( controller => Products, action => import, ) ) ) ) ) ))
  46. 46. CLI Routing: esempio
  47. 47. Conclusioni • Il Routing è stato scritto da zero per ZF2 • E’ abbastanza simile a ZF1, ma i meccanismi interni sono più coerenti, performanti, e spesso più semplici. • ZF2 ha una integrazione nativa del MVC con la console47
  48. 48. DOMANDE?
  49. 49. Grazie per l’attenzione!Diego Drigani@driganid.drigani@mvassociati.it
  50. 50. Photo Credits • http://www.flickr.com/photos/calsid yrose/49 25267732/ • http://www.flickr.com/photos/wili/2692420732/ • http://www.flickr.com/photos/theseanster93/5 027792986/ • http://www.flickr.com/photos/ mcbarnicle/7291518436/ • http://www.flickr.com/photos/arthurfa varo/8383257 961/ • http://www.flickr.com/photos/alt- n-anela/6186835140 • http://www.flickr.com/photos/neil singapore/4236445041/ • http://www.flickr.com/photos/thecolormarlee/49617807 46/50
  51. 51. Diego Drigani@driganid.drigani@mvassociati.it

×