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

Upload: diego-drigani

Post on 07-Dec-2014

1.888 views

Category:

Technology


0 download

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

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]