levate l'ancora! rotte senza problemi con zf2

Post on 07-Dec-2014

1.890 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

Levate l'ancora! Rotte senza problemi con ZF2

Zend 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 richieste

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());

}

PERCHÈ IL ROUTING È IMPORTANTE?

USER FRIENDLY URL

SEO FRIENDLY URL

MAGGIOR SICUREZZA

RESTFUL SERVICES API

TIPI DI ROTTE

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

16

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

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

stringa • Non fa matching di alcun parametro

17

Literal route (esempio) array(

'about' => array(

'type' => 'Literal',

'options' => array(

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

'defaults' => array(

'controller' => 'Pages',

'action' => 'about-us',

)

)

)

)

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

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

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

)

)

)

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

22

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

Query route • Consente di specificare e catturare

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

child_route di un’altra rotta.

23

Query route (esempio)

array(

//...

'catalog_query' => array(

'type' => 'Query'

)

)

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

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

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

)

)

)

)

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

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

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

29

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

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

30

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

//...

)

)

) …

TIPI AVANZATI DI ROTTE

Matching fuori dal path • Hostname route

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

• Scheme route – http, https, ...

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

33

ROUTING NELLE APPLICAZIONI

//module.config.php

return array(

'router' => array(

'routes' => array(

// ...

)

)

);

Definizione delle rotte

I parametri dal controller

class ZfdayController extends AbstractActionController

{

public function indexAction()

{

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

}

}

Redirect

class ZfdayController extends AbstractActionController

{

public function indexAction()

{

$this->redirect()->toRoute(

'routeName',

array(), // Params

array() // Options

);

}

}

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');

}

}

Assembling URLs nella view

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

'routeName',

array(), // Params

array() // Options

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

APPLICAZIONI CLI E ROUTING

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

Boostrapping ZF2 Create file: bin/ecommerce-console

#!/usr/bin/php

<?php

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

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!';

}

}

Definizione: console routing array(

'router' => array(

'routes' => array(

// HTTP routes are defined here

)

),

'console' => array(

'router' => array(

'routes' => array(

// Console routes go here

)

)

)

)

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

)

)

)

)

)

)

)

CLI Routing: esempio

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

DOMANDE?

Grazie per l’attenzione!

Diego Drigani @drigani d.drigani@mvassociati.it

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

Diego Drigani @drigani d.drigani@mvassociati.it

top related