SlideShare a Scribd company logo
1 of 51
Download to read offline
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 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());
}
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-us




16
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',
             )
         )
    )
)
Richiesta
     http://www.hubme.in/get/events.rss

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




19
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%',
         )
    )
)
Richiesta
     http://sale.it/catalog?brand=epson&priceto=20
     0
     http://sale.it/catalog?brand=epson&priceto=200




22
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'
    )
)
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/smartphones




25
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
Definizione delle rotte
//module.config.php
return array(
     'router' => array(
         'routes' => array(
             // ...
         )
     )
);
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 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!';
    }
}
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/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
Diego Drigani
@drigani
d.drigani@mvassociati.it

More Related Content

Viewers also liked

La valutazione delle capacità genitoriali in coppie omosessuali e transessuali
La valutazione delle capacità genitoriali in coppie omosessuali e transessualiLa valutazione delle capacità genitoriali in coppie omosessuali e transessuali
La valutazione delle capacità genitoriali in coppie omosessuali e transessualiRiccardo Giordani
 
Meme Finiquitadoooooooooooooo
Meme FiniquitadooooooooooooooMeme Finiquitadoooooooooooooo
Meme Finiquitadooooooooooooooguest84e62d
 
Using Social Media Advertising to Find and Convert Your Target B2B Audience -...
Using Social Media Advertising to Find and Convert Your Target B2B Audience -...Using Social Media Advertising to Find and Convert Your Target B2B Audience -...
Using Social Media Advertising to Find and Convert Your Target B2B Audience -...Marketing Mojo
 
ParkLake Plaza – Property Xpress (PropertyXpress.com)
ParkLake Plaza – Property Xpress (PropertyXpress.com)ParkLake Plaza – Property Xpress (PropertyXpress.com)
ParkLake Plaza – Property Xpress (PropertyXpress.com)Property Xpress
 
Guida de control ambiental completa
Guida de control ambiental completaGuida de control ambiental completa
Guida de control ambiental completaFibromialgia Sfc
 
Voluntariado Corporativo
Voluntariado CorporativoVoluntariado Corporativo
Voluntariado Corporativobancaliasturias
 
Intersoggettivita' b
Intersoggettivita' bIntersoggettivita' b
Intersoggettivita' bimartini
 
Chint pricelist 04.2015
Chint pricelist 04.2015Chint pricelist 04.2015
Chint pricelist 04.2015mirosabev
 
Practica nº4 morcilla
Practica nº4 morcillaPractica nº4 morcilla
Practica nº4 morcillaLisbeth Yucra
 
Bbs Bba Bms Presto 2010 New Template
Bbs Bba Bms Presto   2010   New TemplateBbs Bba Bms Presto   2010   New Template
Bbs Bba Bms Presto 2010 New TemplateAdarsh Gupta
 
CITOMEGALOVIRUS Zandra
CITOMEGALOVIRUS ZandraCITOMEGALOVIRUS Zandra
CITOMEGALOVIRUS ZandraZandra Tello
 

Viewers also liked (19)

Safaridestinations affordable accommodation
Safaridestinations affordable accommodationSafaridestinations affordable accommodation
Safaridestinations affordable accommodation
 
La valutazione delle capacità genitoriali in coppie omosessuali e transessuali
La valutazione delle capacità genitoriali in coppie omosessuali e transessualiLa valutazione delle capacità genitoriali in coppie omosessuali e transessuali
La valutazione delle capacità genitoriali in coppie omosessuali e transessuali
 
Proyecto sgp
Proyecto sgp Proyecto sgp
Proyecto sgp
 
Meme Finiquitadoooooooooooooo
Meme FiniquitadooooooooooooooMeme Finiquitadoooooooooooooo
Meme Finiquitadoooooooooooooo
 
Using Social Media Advertising to Find and Convert Your Target B2B Audience -...
Using Social Media Advertising to Find and Convert Your Target B2B Audience -...Using Social Media Advertising to Find and Convert Your Target B2B Audience -...
Using Social Media Advertising to Find and Convert Your Target B2B Audience -...
 
Charles Margeson Resume
Charles Margeson ResumeCharles Margeson Resume
Charles Margeson Resume
 
ParkLake Plaza – Property Xpress (PropertyXpress.com)
ParkLake Plaza – Property Xpress (PropertyXpress.com)ParkLake Plaza – Property Xpress (PropertyXpress.com)
ParkLake Plaza – Property Xpress (PropertyXpress.com)
 
Guida de control ambiental completa
Guida de control ambiental completaGuida de control ambiental completa
Guida de control ambiental completa
 
Janusz korczak
Janusz korczakJanusz korczak
Janusz korczak
 
Voluntariado Corporativo
Voluntariado CorporativoVoluntariado Corporativo
Voluntariado Corporativo
 
Senalizacion
SenalizacionSenalizacion
Senalizacion
 
Intersoggettivita' b
Intersoggettivita' bIntersoggettivita' b
Intersoggettivita' b
 
Proyecto de vida
Proyecto de vidaProyecto de vida
Proyecto de vida
 
Chint pricelist 04.2015
Chint pricelist 04.2015Chint pricelist 04.2015
Chint pricelist 04.2015
 
Practica nº4 morcilla
Practica nº4 morcillaPractica nº4 morcilla
Practica nº4 morcilla
 
Bbs Bba Bms Presto 2010 New Template
Bbs Bba Bms Presto   2010   New TemplateBbs Bba Bms Presto   2010   New Template
Bbs Bba Bms Presto 2010 New Template
 
RONALD-RESUME-1
RONALD-RESUME-1RONALD-RESUME-1
RONALD-RESUME-1
 
Sap Managed Services
Sap Managed ServicesSap Managed Services
Sap Managed Services
 
CITOMEGALOVIRUS Zandra
CITOMEGALOVIRUS ZandraCITOMEGALOVIRUS Zandra
CITOMEGALOVIRUS Zandra
 

Similar to Levate l'ancora! Rotte senza problemi con ZF2

SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantSaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantTassi Francesco
 
A Framework for Deadlock Detection in Java
A Framework for Deadlock Detection in JavaA Framework for Deadlock Detection in Java
A Framework for Deadlock Detection in JavaVincenzo Lomonaco
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritornolordarthas
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Luca Lusso
 
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...Tsuneo Kurihara
 
PHP Template Engine (introduzione)
PHP Template Engine (introduzione)PHP Template Engine (introduzione)
PHP Template Engine (introduzione)Asmir Mustafic
 
Sviluppo web con Ruby on Rails
Sviluppo web con Ruby on RailsSviluppo web con Ruby on Rails
Sviluppo web con Ruby on Railsjekil
 
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQueryXeDotNet
 
Effective Code Transformations in C++
Effective Code Transformations in C++Effective Code Transformations in C++
Effective Code Transformations in C++Marco Arena
 
Moduli su Zend Framework 2: come sfruttarli
Moduli su Zend Framework 2: come sfruttarliModuli su Zend Framework 2: come sfruttarli
Moduli su Zend Framework 2: come sfruttarliStefano Valle
 
Drupal 7 : theming avanzato
Drupal 7 : theming avanzatoDrupal 7 : theming avanzato
Drupal 7 : theming avanzatoTwinbit
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingFrancesca1980
 

Similar to Levate l'ancora! Rotte senza problemi con ZF2 (20)

SaaS con Symfony2
SaaS con Symfony2SaaS con Symfony2
SaaS con Symfony2
 
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantSaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenant
 
Angular js: routing
Angular js: routingAngular js: routing
Angular js: routing
 
A Framework for Deadlock Detection in Java
A Framework for Deadlock Detection in JavaA Framework for Deadlock Detection in Java
A Framework for Deadlock Detection in Java
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritorno
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8
 
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
 
Java lezione 10
Java lezione 10Java lezione 10
Java lezione 10
 
Django
DjangoDjango
Django
 
Perl Template Toolkit
Perl Template ToolkitPerl Template Toolkit
Perl Template Toolkit
 
ASP.NET MVC: Full Throttle
ASP.NET MVC: Full ThrottleASP.NET MVC: Full Throttle
ASP.NET MVC: Full Throttle
 
PHP Template Engine (introduzione)
PHP Template Engine (introduzione)PHP Template Engine (introduzione)
PHP Template Engine (introduzione)
 
Sviluppo web con Ruby on Rails
Sviluppo web con Ruby on RailsSviluppo web con Ruby on Rails
Sviluppo web con Ruby on Rails
 
Basi Di Dati 05
Basi Di Dati 05Basi Di Dati 05
Basi Di Dati 05
 
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQuery
 
Introduzione a Ember.js
Introduzione a Ember.jsIntroduzione a Ember.js
Introduzione a Ember.js
 
Effective Code Transformations in C++
Effective Code Transformations in C++Effective Code Transformations in C++
Effective Code Transformations in C++
 
Moduli su Zend Framework 2: come sfruttarli
Moduli su Zend Framework 2: come sfruttarliModuli su Zend Framework 2: come sfruttarli
Moduli su Zend Framework 2: come sfruttarli
 
Drupal 7 : theming avanzato
Drupal 7 : theming avanzatoDrupal 7 : theming avanzato
Drupal 7 : theming avanzato
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computing
 

Levate l'ancora! Rotte senza problemi con ZF2

  • 1. Levate l'ancora! Rotte senza problemi con ZF2 Zend Framework DAY, Milano - Italia 01-02-2013
  • 7. Partiamo da una richiesta http://sales.it/products/smartphones
  • 8. Principio fondamentale di routing • Matching di una richiesta ed estrazione dei parametri • Assembling di nuove richieste
  • 9. Under the hood namespace 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. PERCHÈ IL ROUTING È IMPORTANTE?
  • 16. Richiesta http://www.zfday.it/about-us http://www.zfday.it/about-us 16
  • 17. Literal route • Il più semplice • Fa il matching/assembling letterale di una stringa • Non fa matching di alcun parametro 17
  • 18. Literal route (esempio) array( 'about' => array( 'type' => 'Literal', 'options' => array( 'route' => '/about-us', 'defaults' => array( 'controller' => 'Pages', 'action' => 'about-us', ) ) ) )
  • 19. Richiesta http://www.hubme.in/get/events.rss http://www.hubme.in/get/events.rss http://www.hubme.in/get/cfps.atom 19
  • 20. 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
  • 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. Richiesta http://sale.it/catalog?brand=epson&priceto=20 0 http://sale.it/catalog?brand=epson&priceto=200 22
  • 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. Query route (esempio) array( //... 'catalog_query' => array( 'type' => 'Query' ) )
  • 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/smartphones 25
  • 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. 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. 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
  • 29. Segment patterns (esempio) • /events[/page-:id] – Matches: • /events • /events/page-1 29
  • 30. Segment patterns (esempio) • /events/[page-:id] – Matches: • /events/ • /events/page-1 30
  • 31. 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', //... ) ) ) …
  • 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
  • 35. Definizione delle rotte //module.config.php return array( 'router' => array( 'routes' => array( // ... ) ) );
  • 36. I parametri dal controller class ZfdayController extends AbstractActionController { public function indexAction() { $id = $this->params('id'/*, null */); } }
  • 37. Redirect class ZfdayController extends AbstractActionController { public function indexAction() { $this->redirect()->toRoute( 'routeName', array(), // Params array() // Options ); } }
  • 38. 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'); } }
  • 39. Assembling URLs nella view <a href="<?php echo $this->url( 'routeName', array(), // Params array() // Options );?>">Some Link</a>
  • 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 console 41
  • 42. Boostrapping ZF2 Create file: bin/ecommerce-console #!/usr/bin/php <?php include __DIR__.'/../public/index.php';
  • 43. CLI: controller esempio class 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. Definizione: console routing array( 'router' => array( 'routes' => array( // HTTP routes are defined here ) ), 'console' => array( 'router' => array( 'routes' => array( // Console routes go here ) ) ) )
  • 45. 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', ) ) ) ) ) ) )
  • 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 console 47
  • 49. Grazie per l’attenzione! Diego Drigani @drigani d.drigani@mvassociati.it
  • 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

Editor's Notes

  1. Bene mi presento velocemente, sono Diego Drigani, sono uno sviluppatore php da +10 anni.Vengo dall’Argentina. Da 4 anni che sono in Italia.
  2. Ho lavorato per diverse aziende private e istituzioni in Argentina, Spagna e Italia.
  3. In MvAssociati mi occupo principalemente di Analisi/Sviluppo BE con Zend Framework.
  4. 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.
  5. Bene dunque, partiamo da cos’è il routinghttp://www.flickr.com/photos/calsidyrose/4925267732/
  6. ,
  7. -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
  8. Perchè il routing è importante?perchè ci viene in aiuto per scrivere buoni URL. E perchè dobbiamo preocuparci per avere buoni URL?
  9. -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
  10. ma anche chiaro e indicativo per i motori di ricerca. http://www.flickr.com/photos/theseanster93/5027792986/
  11. Sicurezza: limitare attacchi con la definizione di constraintsAd es: possiamo definire che un determinato parametro solo accetta numeri e di una determinata lunghezza
  12. 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/
  13. 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/
  14. -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.
  15. 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.
  16. 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.
  17. http://www.flickr.com/photos/wili/2692420732/http://www.flickr.com/photos/alt-n-anela/6186835140
  18. Serie di fasi in sequenza
  19. http://www.flickr.com/photos/neilsingapore/4236445041/
  20. 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 ....
  21. http://www.flickr.com/photos/thecolormarlee/4961780746/
  22. http://it.fotolia.com/id/44345011http://it.fotolia.com/id/37463427