Levate l'ancora! Rotte senza problemi con ZF2

51
Levate l'ancora! Rotte senza problemi con ZF2 Zend Framework DAY, Milano - Italia 01-02-2013

description

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à.

Transcript of Levate l'ancora! Rotte senza problemi con ZF2

Page 1: Levate l'ancora! Rotte senza problemi con ZF2

Levate l'ancora! Rotte senza problemi con ZF2

Zend Framework DAY, Milano - Italia 01-02-2013

Page 2: Levate l'ancora! Rotte senza problemi con ZF2

Diego Drigani

Page 3: Levate l'ancora! Rotte senza problemi con ZF2

@drigani

Page 4: Levate l'ancora! Rotte senza problemi con ZF2

http://www.mvassociati.it/

Page 5: Levate l'ancora! Rotte senza problemi con ZF2

http://friuli.grusp.org/

Page 6: Levate l'ancora! Rotte senza problemi con ZF2

COS’È IL ROUTING?

Page 7: Levate l'ancora! Rotte senza problemi con ZF2

Partiamo da una richiesta

http://sales.it/products/smartphones

Page 8: Levate l'ancora! Rotte senza problemi con ZF2

Principio fondamentale di routing • Matching di una richiesta ed estrazione

dei parametri • Assembling di nuove richieste

Page 9: Levate l'ancora! Rotte senza problemi con ZF2

Under the hood namespace Zend\Mvc\Router;

use Zend\Stdlib\RequestInterface as Request;

interface RouteInterface

{

public static function factory($options = array());

public function match(Request $request);

public function assemble(

array $params = array(),

array $options = array());

}

Page 10: Levate l'ancora! Rotte senza problemi con ZF2

PERCHÈ IL ROUTING È IMPORTANTE?

Page 11: Levate l'ancora! Rotte senza problemi con ZF2

USER FRIENDLY URL

Page 12: Levate l'ancora! Rotte senza problemi con ZF2

SEO FRIENDLY URL

Page 13: Levate l'ancora! Rotte senza problemi con ZF2

MAGGIOR SICUREZZA

Page 14: Levate l'ancora! Rotte senza problemi con ZF2

RESTFUL SERVICES API

Page 15: Levate l'ancora! Rotte senza problemi con ZF2

TIPI DI ROTTE

Page 16: Levate l'ancora! Rotte senza problemi con ZF2

http://www.zfday.it/about-us

16

Richiesta http://www.zfday.it/about-us

Page 17: Levate l'ancora! Rotte senza problemi con ZF2

Literal route • Il più semplice • Fa il matching/assembling letterale di una

stringa • Non fa matching di alcun parametro

17

Page 18: Levate l'ancora! Rotte senza problemi con ZF2

Literal route (esempio) array(

'about' => array(

'type' => 'Literal',

'options' => array(

'route' => '/about-us',

'defaults' => array(

'controller' => 'Pages',

'action' => 'about-us',

)

)

)

)

Page 19: Levate l'ancora! Rotte senza problemi con ZF2

http://www.hubme.in/get/cfps.atom

http://www.hubme.in/get/events.rss

19

Richiesta

http://www.hubme.in/get/cfps.atom http://www.hubme.in/get/events.rss

Page 20: Levate l'ancora! Rotte senza problemi con ZF2

Regex route • Il tipo di rotta parameter-matching più

veloce • Il matching basato su regexp • Fa l’assembling sulla base di un

replacement pattern

20

Page 21: Levate l'ancora! Rotte senza problemi con ZF2

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%',

)

)

)

Page 22: Levate l'ancora! Rotte senza problemi con ZF2

http://sale.it/catalog?brand=epson&priceto=200

22

Richiesta http://sale.it/catalog?brand=epson&priceto=200

Page 23: Levate l'ancora! Rotte senza problemi con ZF2

Query route • Consente di specificare e catturare

parametri della query string • L’idea è che venga usata come

child_route di un’altra rotta.

23

Page 24: Levate l'ancora! Rotte senza problemi con ZF2

Query route (esempio)

array(

//...

'catalog_query' => array(

'type' => 'Query'

)

)

Page 25: Levate l'ancora! Rotte senza problemi con ZF2

http://sale.it/catalog

25

http://sale.it/catalog/electronics

Richiesta

http://sale.it/catalog/electronics/smartphones

http://sale.it/catalog http://sale.it/catalog/electronics http://sale.it/catalog/electronics/smartphones

Page 26: Levate l'ancora! Rotte senza problemi con ZF2

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

Page 27: Levate l'ancora! Rotte senza problemi con ZF2

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',

)

)

)

)

Page 28: Levate l'ancora! Rotte senza problemi con ZF2

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 graffe

28

Page 29: Levate l'ancora! Rotte senza problemi con ZF2

Segment patterns (esempio) • /events[/page-:id]

– Matches: • /events • /events/page-1

29

Page 30: Levate l'ancora! Rotte senza problemi con ZF2

Segment patterns (esempio) • /events/[page-:id]

– Matches: • /events/ • /events/page-1

30

Page 31: Levate l'ancora! Rotte senza problemi con ZF2

Combinando alcune rotte array(

'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',

//...

)

)

) …

Page 32: Levate l'ancora! Rotte senza problemi con ZF2

TIPI AVANZATI DI ROTTE

Page 33: Levate l'ancora! Rotte senza problemi con ZF2

Matching fuori dal path • Hostname route

– :user.users.cpanel.it • diego.users.cpanel.it

• Scheme route – http, https, ...

• Method route – GET, POST, PUT, ...

33

Page 34: Levate l'ancora! Rotte senza problemi con ZF2

ROUTING NELLE APPLICAZIONI

Page 35: Levate l'ancora! Rotte senza problemi con ZF2

//module.config.php

return array(

'router' => array(

'routes' => array(

// ...

)

)

);

Definizione delle rotte

Page 36: Levate l'ancora! Rotte senza problemi con ZF2

I parametri dal controller

class ZfdayController extends AbstractActionController

{

public function indexAction()

{

$id = $this->params('id'/*, null */);

}

}

Page 37: Levate l'ancora! Rotte senza problemi con ZF2

Redirect

class ZfdayController extends AbstractActionController

{

public function indexAction()

{

$this->redirect()->toRoute(

'routeName',

array(), // Params

array() // Options

);

}

}

Page 38: Levate l'ancora! Rotte senza problemi con ZF2

Assembling URLs nel controller class ZfdayController extends AbstractActionController

{

public function indexAction()

{

$url = $this->url()->fromRoute(

'routeName',

array(), // Params

array() // Options

);

$this->redirect()->toUrl($url . '#anchorName');

}

}

Page 39: Levate l'ancora! Rotte senza problemi con ZF2

Assembling URLs nella view

<a href="<?php echo $this->url(

'routeName',

array(), // Params

array() // Options

);?>">Some Link</a>

Page 40: Levate l'ancora! Rotte senza problemi con ZF2

APPLICAZIONI CLI E ROUTING

Page 41: Levate l'ancora! Rotte senza problemi con ZF2

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 console

41

Page 42: Levate l'ancora! Rotte senza problemi con ZF2

Boostrapping ZF2 Create file: bin/ecommerce-console

#!/usr/bin/php

<?php

include __DIR__.'/../public/index.php';

Page 43: Levate l'ancora! Rotte senza problemi con ZF2

CLI: controller esempio

class ProductsController extends AbstractActionController {

public function importAction() {

$request = $this->getRequest();

if (!$request instanceof Zend\Console\Request){

throw new \RuntimeException('only from console!');

}

//do products import

return 'Import done!';

}

public function updateAction() {

//do products update prices and stocks

return 'Update done!';

}

}

Page 44: Levate l'ancora! Rotte senza problemi con ZF2

Definizione: console routing array(

'router' => array(

'routes' => array(

// HTTP routes are defined here

)

),

'console' => array(

'router' => array(

'routes' => array(

// Console routes go here

)

)

)

)

Page 45: Levate l'ancora! Rotte senza problemi con ZF2

CLI Routing: esempio array(

'console' => array(

'router' => array(

'routes' => array(

'command_import' => array(

'type' => 'simple',

'options' => array(

'route' => 'import',

'defaults' => array(

'controller' => 'Products',

'action' => 'import',

)

)

)

)

)

)

)

Page 46: Levate l'ancora! Rotte senza problemi con ZF2

CLI Routing: esempio

Page 47: Levate l'ancora! Rotte senza problemi con ZF2

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 console

47

Page 48: Levate l'ancora! Rotte senza problemi con ZF2

DOMANDE?

Page 49: Levate l'ancora! Rotte senza problemi con ZF2

Grazie per l’attenzione!

Diego Drigani @drigani [email protected]

Page 50: Levate l'ancora! Rotte senza problemi con ZF2

Photo Credits • http://www.flickr.com/photos/calsidyrose/4925267732/ • http://www.flickr.com/photos/wili/2692420732/ • http://www.flickr.com/photos/theseanster93/5027792986/ • http://www.flickr.com/photos/mcbarnicle/7291518436/ • http://www.flickr.com/photos/arthurfa varo/8383257961/ • http://www.flickr.com/photos/alt-n-anela/6186835140 • http://www.flickr.com/photos/neilsingapore/4236445041/ • http://www.flickr.com/photos/thecolormarlee/4961780746/

50

Page 51: Levate l'ancora! Rotte senza problemi con ZF2

Diego Drigani @drigani [email protected]