Levate lancora!          Rotte senza problemi con ZF2Zend Framework DAY, Milano - Italia 01-02-2013
Diego Drigani
@drigani
http://www.mvassociati.it/
http://friuli.grusp.org/
COS’È IL ROUTING?
Partiamo da una richiesta      http://sales.it/products/smartphones
Principio fondamentale di routing•   Matching di una richiesta ed estrazione    dei parametri•   Assembling di nuove richi...
Under the hoodnamespace ZendMvcRouter;use ZendStdlibRequestInterface as Request;interface RouteInterface{    public static...
PERCHÈ IL ROUTING  È IMPORTANTE?
USER FRIENDLY URL
SEO FRIENDLY URL
MAGGIOR SICUREZZA
RESTFUL SERVICES API
TIPI DI ROTTE
Richiesta     http://www.zfday.it/about-us     http://www.zfday.it/about-us16
Literal route     •   Il più semplice     •   Fa il matching/assembling letterale di una         stringa     •   Non fa ma...
Literal route (esempio)array(    about => array(         type => Literal,         options => array(             route => /...
Richiesta     http://www.hubme.in/get/events.rss     http://www.hubme.in/get/events.rss     http://www.hubme.in/get/cfps.a...
Regex route     •   Il tipo di rotta parameter-matching più         veloce     •   Il matching basato su regexp     •   Fa...
Regex route (esempio)array(    get => array(         type => Regex,         options => array(             regex=>         ...
Richiesta     http://sale.it/catalog?brand=epson&priceto=20     0     http://sale.it/catalog?brand=epson&priceto=20022
Query route     •   Consente di specificare e catturare         parametri della query string     •   L’idea è che venga us...
Query route (esempio)array(    //...    catalog_query => array(         type => Query    ))
Richiesta     http://sale.it/catalog     http://sale.it/catalog     http://sale.it/catalog/electronics     http://sale.it/...
Segment route     •   Il tipo più flessibile     •   Matching molto veloce, giacchè i segment         patterns sono intern...
Segment route (esempio)array(    catalog => array(         type => Segment,         options => array(             route =>...
Struttura segment patterns     •   I segmenti opzionali         – Sono indicati tra parentesi quadre         – Possono ess...
Segment patterns (esempio)     •   /events[/page-:id]         – Matches:            • /events            • /events/page-129
Segment patterns (esempio)     •   /events/[page-:id]         – Matches:            • /events/            • /events/page-130
Combinando alcune rottearray(    catalog => array(        type => Literal,        options => array(            route => /c...
TIPI AVANZATI DI ROTTE
Matching fuori dal path     •   Hostname route         – :user.users.cpanel.it            • diego.users.cpanel.it     •   ...
ROUTING NELLE APPLICAZIONI
Definizione delle rotte//module.config.phpreturn array(     router => array(         routes => array(             // ...  ...
I parametri dal controllerclass ZfdayController extends AbstractActionController{    public function indexAction()    {   ...
Redirectclass ZfdayController extends AbstractActionController{    public function indexAction()    {        $this->redire...
Assembling URLs nel controllerclass ZfdayController extends AbstractActionController{    public function indexAction()    ...
Assembling URLs nella view<a href="<?php echo $this->url(                   routeName,                   array(), // Param...
APPLICAZIONI CLI E ROUTING
Introduzione console routing     •   ZF2 ha una integrazione nativa del MVC         con la console     •   Permette di ind...
Boostrapping ZF2Create file: bin/ecommerce-console#!/usr/bin/php<?phpinclude __DIR__./../public/index.php;
CLI: controller esempioclass ProductsController extends AbstractActionController {    public function importAction() {    ...
Definizione: console routingarray(    router => array(         routes => array(              // HTTP routes are defined he...
CLI Routing: esempioarray(    console => array(         router => array(             routes => array(                 comm...
CLI Routing: esempio
Conclusioni     •   Il Routing è stato scritto da zero per ZF2     •   E’ abbastanza simile a ZF1, ma i         meccanismi...
DOMANDE?
Grazie per l’attenzione!Diego Drigani@driganid.drigani@mvassociati.it
Photo Credits     •   http://www.flickr.com/photos/calsid yrose/49 25267732/     •   http://www.flickr.com/photos/wili/269...
Diego Drigani@driganid.drigani@mvassociati.it
Upcoming SlideShare
Loading in...5
×

Levate l'ancora! Rotte senza problemi con ZF2

1,599

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
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,599
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Bene mi presento velocemente, sono Diego Drigani, sono uno sviluppatore php da +10 anni.Vengo dall’Argentina. Da 4 anni che sono in Italia.
  • Ho lavorato per diverse aziende private e istituzioni in Argentina, Spagna e Italia.
  • In MvAssociati mi occupo principalemente di Analisi/Sviluppo BE con Zend Framework.
  • Bene, sono anche uno dei membri del PHP user group Friuli. Facciamo meetings una volta al mese. Tra pizze e birre qualcuno ci fa anche belle presentazioni.
  • Bene dunque, partiamo da cos’è il routinghttp://www.flickr.com/photos/calsidyrose/4925267732/
  • ,
  • -Il factory semplicemente serve per creare una rotta di un certo tipo, noi non dovremo preocuparci per questo per che il framework passerà la nostra configuracione e creerà le nostre rotte secondo la nostra definizione nel file di configurazione.Poi, vediamo il metodo Match, al quale viene passato un object con la richiesta. Possiamo interrogarlo per sapere nome de rotta e i valori dei parametriPasseremo params e options. Questa implementazione è un po diversa da ZF1 che solo c’era params, in zf2 possiamo especificare options ad es il locate della rotta
  • Perchè il routing è importante?perchè ci viene in aiuto per scrivere buoni URL. E perchè dobbiamo preocuparci per avere buoni URL?
  • -FriendlyURL indirizzo chiaramente leggibile, identificabile, magari memorizzabile dall’utente, http://it.fotolia.com/id/42952376http://it.fotolia.com/id/31545503http://it.fotolia.com/id/44345011http://it.fotolia.com/id/21255963
  • ma anche chiaro e indicativo per i motori di ricerca. http://www.flickr.com/photos/theseanster93/5027792986/
  • Sicurezza: limitare attacchi con la definizione di constraintsAd es: possiamo definire che un determinato parametro solo accetta numeri e di una determinata lunghezza
  • Restful webservices: se ci troviamo a dover sviluppare restful web services bisogna sicuramente avere una padronanza del routing.http://www.flickr.com/photos/mcbarnicle/7291518436/
  • Ok adesso faremo una carrellata tra i tipi di rotte path routes che sicuramente useremmo più spesso nelle nostre applicazioni.http://www.flickr.com/photos/arthurfavaro/8383257961/
  • -SempliceIn ZF1 lo conoscevamo come Static route. Questo praticamente è stato rinominato giachè non si poteva utilizzare Static come nome di un namespace in php 5.3.
  • Questa tipopuò essere di aiuto nel caso abbiamo un sito con le solite pagine statiche: about-us, privacy, ecc che hanno un contenuto piuttosto statico. Quindi invece di creare N controllers, possiamo creare un solo Controller chiamato Pages e poi un action per ogni pagina statica.
  • in zend framework uno il replace pattern era basato su sprintf ad esempio /bar/%s/foo/%d %s per gli string % d per i numeri e poi dovevamo passarli un map array per dirle in che possisione pasavamo che parametro que in pratica era un po’ repetitivo Bene qua hanno seplificato parecchio, basta solo specificare un replacement pattern che molto più leggibile basato su tokens ad es: /get/%type% che alla fin fine farà un str_replace, diventando così molto semplice.
  • http://www.flickr.com/photos/wili/2692420732/http://www.flickr.com/photos/alt-n-anela/6186835140
  • Serie di fasi in sequenza
  • http://www.flickr.com/photos/neilsingapore/4236445041/
  • Come Good practice dopo una determinata action e da fare un redirect a una congratulations page, per evitare così che l’utente possa eventualmente fare un reload della pagina e ri fare così una transazzione. Bene per questo possiamo ussare il plugin redirect ....
  • http://www.flickr.com/photos/thecolormarlee/4961780746/
  • http://it.fotolia.com/id/44345011http://it.fotolia.com/id/37463427
  • 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
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×