SlideShare uma empresa Scribd logo
1 de 113
Baixar para ler offline
Arrivano i moduli
                 come li sfruttiamo?




Zend Framework Day – Milano – 01/02/2013
@stefanovalle
http://www.mvassociati.it/
http://friuli.grusp.org/
I MODULI DI ZF2
I moduli, come li conosciamo in ZF1

                          Sito Web
      contenuti statici, catalogo servizi, form contatti, ecc.




6
I moduli, come li conosciamo in ZF1

                             Sito Web
        contenuti statici, catalogo servizi, form contatti, ecc.




                Amministrazione sito Web
    gestione contenuti statici, catalogo servizi, form contatti, ecc.



7
I moduli, come li conosciamo in ZF1

                             Sito Web
        contenuti statici, catalogo servizi, form contatti, ecc.




                              Modello



                Amministrazione sito Web
    gestione contenuti statici, catalogo servizi, form contatti, ecc.



8
E IN ZF2?
A re-usable piece of
     functionality that can be used
      to construct a more complex
               application.
                 Evan Coury - http://evan.pro/zf2-modules-talk.html




10
A re-usable piece of
     functionality that can be used
      to construct a more complex
               application.
                 Evan Coury - http://evan.pro/zf2-modules-talk.html




11
Cosa posso riutilizzare?

                                Sito Web
           contenuti statici, catalogo servizi, form contatti, ecc.




                                 Modello



                   Amministrazione sito Web
       gestione contenuti statici, catalogo servizi, form contatti, ecc.



12
Cosa posso riutilizzare?

                                Sito Web
           contenuti statici, catalogo servizi, form contatti, ecc.




                                 Modello



                   Amministrazione sito Web
       gestione contenuti statici, catalogo servizi, form contatti, ecc.



13
Pensiamo alle funzionalità

                                   Sito Web


       Contenuti
       e pagine                     Modello
        statiche




                             Amministrazione
                                   sito Web


14
Pensiamo alle funzionalità

                                               Sito Web


       Contenuti
                   Catalogo    Form
       e pagine
                    servizi   contatti          Modello
        statiche




                                         Amministrazione
                                               sito Web


15
Ecco i moduli!

                                               Sito Web


       Contenuti
                   Catalogo    Form
       e pagine
                    servizi   contatti          Modello
        statiche




                                         Amministrazione
                                               sito Web


16
OK, MA IN CONCRETO?
Namespace   Module.php   Modulo




18
Namespace         Module.php       Modulo




                 Namespace MioModulo;

                 Class Module {}




19
Cosa possiamo farci?
      Formattare una     Mostrare una
          valuta       form di contatto




20
Cosa possiamo farci?
      Formattare una       Mostrare una
          valuta         form di contatto

      Gestire utenti e     Integrare un
            ACL                ORM




21
Cosa possiamo farci?
      Formattare una       Mostrare una
          valuta         form di contatto

      Gestire utenti e     Integrare un
            ACL                ORM

                Inglobare tutta
                 l’applicazione

22
Cosa possiamo farci?
      Formattare una       Mostrare una
          valuta         form di contatto

      Gestire utenti e     Integrare un
            ACL                ORM

                Inglobare tutta
                 l’applicazione

23
PROVIAMO A CAPIRCI QUALCOSA
Dove si trovano?


                   Moduli dell’applicazione


                    Moduli di terze parti




25
Da dove partiamo?
     http://modules.zendframework.com/




26
Com’è fatto un modulo


                 configurazioni




27
File di configurazione
// config/module.config.php

return array(
  'router' => array(
    'routes' => array(...)
   ),

    'controllers' => array(...),

    'service_manager' => array(...),

    'view_manager' => array(...),

    ...

)
Com’è fatto un modulo


                 file PHP del modulo
                 (Controller, Form, Modello, Servizi, ecc.)




29
Com’è fatto un modulo


                 File per il test del modulo




30
Com’è fatto un modulo


                 tutto ciò che riguarda le viste
                 (pagine, layout, partials)




31
Attivazione di un modulo
     config/application.config.php

     return array(
       'modules' => array(
          'DoctrineModule',
          'DoctrineORMModule',
          'SpeckPaypal',
          'Application',
       ),
     ),
     ...




32
Attivazione di un modulo
     config/application.config.php

     return array(
       'modules' => array(
          'DoctrineModule',
          'DoctrineORMModule',
          'SpeckPaypal',
                                        Attenzione
          'Application',             all’ordinamento
       ),
     ),
     ...




33
MERGE DELLA CONFIGURAZIONE
Posso fare l’override…
     …di viste / layout   return array(
                            ...
                            'view_manager' => array(
                              ...
                            ),
                          )




35
Posso fare l’override…
     …di viste / layout   return array(
                            ...
     …del routing           'router' => array(
                              ...
                            ),
                          )




36
Posso fare l’override…
     …di viste / layout
     …del routing
     …di tutte le configurazioni




37
Posso fare l’override…
     …di viste / layout
     …del routing
     …di tutte le configurazioni


                                     estendendo,
                                   non modificando il
                                    modulo originale



38
RIUSABILI
Realizziamo un E-Commerce




40
DIAMO UN’OCCHIATA IN GIRO…
DUBBI INCONTRATI
1 - COME ORGANIZZO I MODULI?
Di cosa ho bisogno?




44
Di cosa ho bisogno?
     •   Catalogo prodotti
     •   Carrello
     •   Checkout (e pagamento)
     •   Pagine (più o meno statiche)
     •   Pannello amministrativo




45
Di cosa ho bisogno?
     •   Catalogo prodotti
     •   Carrello                       Un modulo
     •   Checkout (e pagamento)          ciascuno
     •   Pagine (più o meno statiche)
     •   Pannello amministrativo




46
Di cosa ho bisogno?
     •   Catalogo prodotti
     •   Carrello                                       Un modulo
     •   Checkout (e pagamento)                          ciascuno
     •   Pagine (più o meno statiche)
     •   Pannello amministrativo


                   «orizzontale» rispetto agli altri moduli
                   (lasciamolo un attimo in sospeso…)


47
2) IMMAGINI/JS/CSS
Condivisi
     Librerie javascript, loghi, pulsanti, CSS, ecc.




49
Condivisi
     Librerie javascript, loghi, pulsanti, CSS, ecc.


     Dove li mettiamo?




50
Condivisi
     Librerie javascript, loghi, pulsanti, CSS, ecc.


     Dove li mettiamo?
     Dentro cartella /public?




51
Esclusivi
     Librerie javascript, immagini e CSS che
     servono solo ad un singolo modulo




52
Esclusivi
     Librerie javascript, immagini e CSS che
     servono solo ad un singolo modulo

     Dove li mettiamo?




53
Esclusivi
     Librerie javascript, immagini e CSS che
     servono solo ad un singolo modulo

     Dove li mettiamo?
     Dentro ciascun modulo!




54
Soluzioni?
     •   Copia & incolla dei file dentro la cartella
         public?
     •   Symlinks?
     •   Configurare apache per «cercare» i file fra
         i vari moduli?




55
Meglio: modulo AssetManager




56
Esistono anche alternative, ad
     esempio…




57
Modulo AssetManager



          Assets
                    Asset
                   Manager




58
Resolvers




     Assets
               Asset      Filters
              Manager




59
Resolvers




     Assets
               Asset      Filters
              Manager




               Cache




60
Dove mettiamo gli asset?


                  tutti gli asset
                   del modulo




61
module.config.php
return array(
  'asset_manager' => array(
    'resolver_configs' => array(
      'paths' => array(
        __DIR__ . '/../assets',
      ),
),),), ...
module.config.php
return array(
  'asset_manager' => array(
    'resolver_configs' => array(
      'paths' => array(
        __DIR__ . '/../assets',
      ),
),),), ...




              layout.php
              echo $this->headLink()
                   ->prependStylesheet($this->basePath() .
                                       '/css/miocss.css');
module.config.php
return array(
'asset_manager' => array(
  'resolver_configs' => array(
    'map' => array(
       'css/primo.css' => __DIR__.'/../assets/css/primo.css',
       'css/secondo.css' => __DIR__.'/../assets/css/secondo.css',
    ),
    'collections' => array(
       'css/merge.css' => array( 'css/primo.css','css/secondo.css',
),),),),), ...
module.config.php
return array(
'asset_manager' => array(
  'resolver_configs' => array(
    'map' => array(
       'css/primo.css' => __DIR__.'/../assets/css/primo.css',
       'css/secondo.css' => __DIR__.'/../assets/css/secondo.css',
    ),
    'collections' => array(
       'css/merge.css' => array( 'css/primo.css','css/secondo.css',
),),),),), ...



                layout.php
                echo $this->headLink()
                     ->prependStylesheet($this->basePath() .
                                         '/css/merge.css');
Ora il modulo è davvero
             riusabile!




66
3) ENTITA’ CONDIVISE
Catalogo   Carrello




68
Catalogo                    Carrello
                  moduli




                Prodotto
            (con la sua entità del
            modello, i mappers, i
                servizi, ecc.)




69
Catalogo              Carrello
                  moduli




                Prodotto
           - id
           - nome
           - prezzo




70
Catalogo              Carrello

          ?                ?
                Prodotto
           - id
           - nome
           - prezzo




71
Modulo «carrello», vorrei:
     •   Vederlo all’opera standalone,
         senza altre dipendenze




72
Modulo «carrello», vorrei:
     •   Vederlo all’opera standalone,
         senza altre dipendenze
     •   Poter gestire prodotti diversi




73
Modulo «carrello», vorrei:
     •   Vederlo all’opera standalone,
         senza altre dipendenze
     •   Poter gestire prodotti diversi
     •   Poter definire dei «vincoli» su logica e
         campi (almeno nome + prezzo)




74
Il carrello vuole un prodotto con
     certe caratteristiche...




75
Carrello

        Prodotto
     - id
     - nome
     - prezzo




76
Catalogo              Carrello

          Prodotto              Prodotto
     - id                    - id
     - nome                  - nome
     - prezzo                - prezzo




     -   dimensioneSchermo
     -   RAM
     -   prezzoOfferta
     -   …


77
Catalogo            Carrello

          Prodotto
     - id
     - nome
     - prezzo




     -   dimensioneSchermo
     -   RAM
     -   prezzoOfferta
     -   …


78
Come? Con il Service Manager
/* Modulo Carrello – module.config.php */

return array(
   'router' => array(…),
   'controllers' => array(…),
   'service_manager' => array(
     'invokables' => array(
        'EcommerceService' => 'CarrelloServiceEcommerceService',
        'ProductService' => 'CarrelloServiceProductService',
     ),
     'factories' => array(…)
   )
);
ProductService
/* Modulo Carrello – EcommerceServiceProductService */

class ProductService implements ... {

    public function getProduct($i_product) {
      $I_repository = $this->getEntityManager()
           ->getRepository('CarrelloEntityCartproduct');
      return $I_repository->find($i_product);
    }

}
Nel modulo «catalogo»? Override!
/* Modulo Catalogo – module.config.php */

return array(
   'router' => array(…),
   'controllers' => array(…),
   'service_manager' => array(
     'invokables' => array(
        'ProductService' => 'CatalogServiceMyProductService',
     ),
     'factories' => array(…)
   )
);
Nel modulo «catalogo»? Override!
/* Modulo Catalogo – module.config.php */

return array(
   'router' => array(…),
   'controllers' => array(…),
   'service_manager' => array(
     'invokables' => array(
        'ProductService' => 'CatalogServiceMyProductService',
     ),
     'factories' => array(…)
   )
);
E i «vincoli» (es. nome + prezzo)?
E i «vincoli» (es. nome + prezzo)?
Ereditarietà di classe
/**
 * CatalogEntityProduct
 * ...
*/

class Product extends EcommerceEntityCartproduct {}



O implementando interfaccia
/**
 * CatalogEntityProduct
 * ...
*/

class Product implements EcommerceEntityCartproductInterface {}
Catalogo             Carrello

       Prodotto
      id, nome, prezzo



     dimensioneSchermo,
     RAM, prezzoOfferta,
             …



      Servizi, mapper,
     comportamenti, …


85
Ora il modulo è davvero
             riusabile!




86
PROBLEMA 4: PANNELLO ADMIN
Ho bisogno
     di un’altra cartella
          /public?




88
Ho bisogno
     di un’altra cartella
          /public?

     Probabilmente no
      (a meno di casi particolari)




89
Creo un modulo per tutta la
        parte amministrativa?




90
Creo un modulo per tutta la
        parte amministrativa?


             Potrei…
      ma non sarebbe riusabile
           (né lui né gli altri moduli)




91
Inglobo la parte amministrativa
         dentro ciascun modulo?




92
Inglobo la parte amministrativa
         dentro ciascun modulo?



                     Esatto!
          O almeno nella maggioranza dei casi




93
Da dove eravamo partiti…

                                               Sito Web


       Contenuti
                   Catalogo    Form
       e pagine
                    servizi   contatti          Modello
        statiche




                                         Amministrazione
                                               sito Web


94
Ciò che voglio:
     http://mio.si.to/admin
     http://mio.si.to/admin/catalog
     http://mio.si.to/admin/user
     http://mio.si.to/admin/purchase
     …




95
Come?




       Un modulo di

96
1. Attivazione modulo
/* application.config.php */

return array(
  'modules' => array(…),
     'ZfcAdmin',
     'Application',
  ),
);
2. Creazione controller




98
3. Configurazione routing
/* Modulo Catalog – module.config.php */

return array(
   'router' => array(
      'zfcadmin' => array(
        'child_routes' => array(
          'catalog' => array(
            'type' => 'Literal',
            'options' => array(
               'route' => '/catalog',
               'defaults' => array(
                  'controller' => 'CatalogControllerAdmin',
                  'action' => 'index',
               ),
             ),),),),
   ),
);
3. Configurazione routing
/* Modulo Catalog – module.config.php */

return array(
   'router' => array(
      'zfcadmin' => array(
        'child_routes' => array(
          'catalog' => array(
            'type' => 'Literal',
            'options' => array(
               'route' => '/catalog',
               'defaults' => array(
                  'controller' => 'CatalogControllerAdmin',
                  'action' => 'index',
               ),
             ),),),),
   ),
);
3. Configurazione routing
/* Modulo Catalog – module.config.php */

return array(
   'router' => array(
      'zfcadmin' => array(
        'child_routes' => array(                     /admin/catalog
          'catalog' => array(
            'type' => 'Literal',
            'options' => array(
               'route' => '/catalog',
               'defaults' => array(
                  'controller' => 'CatalogControllerAdmin',
                  'action' => 'index',
               ),
             ),),),),
   ),
);
Il pannello admin del
         modulo è pronto!



102
Il pannello admin del
         modulo è pronto!

          e l’autenticazione?



103
Autenticazione




                   +
104
Gestione autorizzazioni
/* Modulo AppCatalog – module.config.php */

return array(
  …
  'bjyauthorize' => array(
     'guards' => array(
        'BjyAuthorizeGuardRoute' => array(
          array('route' => 'zfcadmin/catalog',
                'roles' => array('user')),
        ),
     ),
  ),
);
Tiriamo le somme




106
+ RIUSO
APPLICAZIONI CUSTOM
Grazie per l’attenzione




Stefano Valle
@stefanovalle
s.valle@mvassociati.it
DOMANDE?
Photo Credits
      •   http://www.flickr.com/photos/10459273@N05/4771563267
      •   http://www.flickr.com/photos/vittoriomilanes/8286559013
      •   http://www.flickr.com/photos/criminalintent/5101528210
      •   http://www.flickr.com/photos/billward/5626976800
      •   http://www.flickr.com/photos/frikitiki/3751108796
      •   http://www.flickr.com/photos/billward/5626389173
      •   http://www.flickr.com/photos/jlz/4275224658
      •   http://www.flickr.com/photos/slackpics/4289782818
      •   http://www.flickr.com/photos/pullip_junk/6624713631
      •   http://www.flickr.com/photos/nasahqphoto/5162244810
      •   http://www.flickr.com/photos/comedynose/5340477326
      •   http://www.flickr.com/photos/tracyleephoto/8322509672
      •   http://www.flickr.com/photos/michelleundihrefotos/5970015736
      •   http://www.flickr.com/photos/hefhoover/3929261255
      •   http://www.flickr.com/photos/89544908@N00/7877685112/




113

Mais conteúdo relacionado

Semelhante a Moduli su Zend Framework 2: come sfruttarli

Giovambattista Fazioli, 10 more things
Giovambattista Fazioli, 10 more thingsGiovambattista Fazioli, 10 more things
Giovambattista Fazioli, 10 more thingsKnowCamp
 
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
 
Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)DotNetMarche
 
Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)brossi676
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC FrameworkDotNetMarche
 
Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Fabio Armani
 
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the WebClaudio Gandelli
 
Introduzione a Drupal - Versione Italiana
Introduzione a Drupal - Versione ItalianaIntroduzione a Drupal - Versione Italiana
Introduzione a Drupal - Versione ItalianaGiovanni Buffa
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptSinergia Totale
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsAndrea Dottor
 
We Want Web - Web Applications con MVC 3
We Want Web - Web Applications con MVC 3We Want Web - Web Applications con MVC 3
We Want Web - Web Applications con MVC 3DomusDotNet
 
Drupal 4 stakeholder
Drupal 4 stakeholderDrupal 4 stakeholder
Drupal 4 stakeholderbmeme
 
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2Bkino2k
 
Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0Alessandro Forte
 
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019Matteo Enna
 
Designing the User Experience
Designing the User ExperienceDesigning the User Experience
Designing the User ExperienceFulvio Corno
 
Tra Design e interattività : Come progettare un sito web
Tra Design e interattività : Come progettare un sito webTra Design e interattività : Come progettare un sito web
Tra Design e interattività : Come progettare un sito webEstensa Srl
 
Rendere flessibili e trasformare architetture IT di vecchio tipo: passaggio d...
Rendere flessibili e trasformare architetture IT di vecchio tipo:passaggio d...Rendere flessibili e trasformare architetture IT di vecchio tipo:passaggio d...
Rendere flessibili e trasformare architetture IT di vecchio tipo: passaggio d...Emanuele Della Valle
 

Semelhante a Moduli su Zend Framework 2: come sfruttarli (20)

Giovambattista Fazioli, 10 more things
Giovambattista Fazioli, 10 more thingsGiovambattista Fazioli, 10 more things
Giovambattista Fazioli, 10 more things
 
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
 
Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)
 
Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)
 
Sa framework
Sa frameworkSa framework
Sa framework
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC Framework
 
Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)
 
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the Web
 
Introduzione a Drupal - Versione Italiana
Introduzione a Drupal - Versione ItalianaIntroduzione a Drupal - Versione Italiana
Introduzione a Drupal - Versione Italiana
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.js
 
DDive11 - xpages
DDive11 - xpagesDDive11 - xpages
DDive11 - xpages
 
We Want Web - Web Applications con MVC 3
We Want Web - Web Applications con MVC 3We Want Web - Web Applications con MVC 3
We Want Web - Web Applications con MVC 3
 
Drupal 4 stakeholder
Drupal 4 stakeholderDrupal 4 stakeholder
Drupal 4 stakeholder
 
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
 
Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0
 
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019
 
Designing the User Experience
Designing the User ExperienceDesigning the User Experience
Designing the User Experience
 
Tra Design e interattività : Come progettare un sito web
Tra Design e interattività : Come progettare un sito webTra Design e interattività : Come progettare un sito web
Tra Design e interattività : Come progettare un sito web
 
Rendere flessibili e trasformare architetture IT di vecchio tipo: passaggio d...
Rendere flessibili e trasformare architetture IT di vecchio tipo:passaggio d...Rendere flessibili e trasformare architetture IT di vecchio tipo:passaggio d...
Rendere flessibili e trasformare architetture IT di vecchio tipo: passaggio d...
 

Mais de Stefano Valle

IoT: protocolli, dispositivi, architetture
IoT: protocolli, dispositivi, architettureIoT: protocolli, dispositivi, architetture
IoT: protocolli, dispositivi, architettureStefano Valle
 
Protocol Rollercoaster: da HTTP a AMQP, passando per CoAP e MQTT
Protocol Rollercoaster: da HTTP a AMQP, passando per CoAP e MQTTProtocol Rollercoaster: da HTTP a AMQP, passando per CoAP e MQTT
Protocol Rollercoaster: da HTTP a AMQP, passando per CoAP e MQTTStefano Valle
 
Instant ACLs with Zend Framework 2
Instant ACLs with Zend Framework 2Instant ACLs with Zend Framework 2
Instant ACLs with Zend Framework 2Stefano Valle
 
NoSQL Containers get Rich
NoSQL Containers get RichNoSQL Containers get Rich
NoSQL Containers get RichStefano Valle
 
Asset management with Zend Framework 2
Asset management with Zend Framework 2Asset management with Zend Framework 2
Asset management with Zend Framework 2Stefano Valle
 
Stime e preventivi in un contesto di sviluppo agile
Stime e preventivi in un contesto di sviluppo agileStime e preventivi in un contesto di sviluppo agile
Stime e preventivi in un contesto di sviluppo agileStefano Valle
 
Introduzione alle metodologie di sviluppo agile
Introduzione alle metodologie di sviluppo agileIntroduzione alle metodologie di sviluppo agile
Introduzione alle metodologie di sviluppo agileStefano Valle
 

Mais de Stefano Valle (7)

IoT: protocolli, dispositivi, architetture
IoT: protocolli, dispositivi, architettureIoT: protocolli, dispositivi, architetture
IoT: protocolli, dispositivi, architetture
 
Protocol Rollercoaster: da HTTP a AMQP, passando per CoAP e MQTT
Protocol Rollercoaster: da HTTP a AMQP, passando per CoAP e MQTTProtocol Rollercoaster: da HTTP a AMQP, passando per CoAP e MQTT
Protocol Rollercoaster: da HTTP a AMQP, passando per CoAP e MQTT
 
Instant ACLs with Zend Framework 2
Instant ACLs with Zend Framework 2Instant ACLs with Zend Framework 2
Instant ACLs with Zend Framework 2
 
NoSQL Containers get Rich
NoSQL Containers get RichNoSQL Containers get Rich
NoSQL Containers get Rich
 
Asset management with Zend Framework 2
Asset management with Zend Framework 2Asset management with Zend Framework 2
Asset management with Zend Framework 2
 
Stime e preventivi in un contesto di sviluppo agile
Stime e preventivi in un contesto di sviluppo agileStime e preventivi in un contesto di sviluppo agile
Stime e preventivi in un contesto di sviluppo agile
 
Introduzione alle metodologie di sviluppo agile
Introduzione alle metodologie di sviluppo agileIntroduzione alle metodologie di sviluppo agile
Introduzione alle metodologie di sviluppo agile
 

Moduli su Zend Framework 2: come sfruttarli

  • 1. Arrivano i moduli come li sfruttiamo? Zend Framework Day – Milano – 01/02/2013
  • 6. I moduli, come li conosciamo in ZF1 Sito Web contenuti statici, catalogo servizi, form contatti, ecc. 6
  • 7. I moduli, come li conosciamo in ZF1 Sito Web contenuti statici, catalogo servizi, form contatti, ecc. Amministrazione sito Web gestione contenuti statici, catalogo servizi, form contatti, ecc. 7
  • 8. I moduli, come li conosciamo in ZF1 Sito Web contenuti statici, catalogo servizi, form contatti, ecc. Modello Amministrazione sito Web gestione contenuti statici, catalogo servizi, form contatti, ecc. 8
  • 10. A re-usable piece of functionality that can be used to construct a more complex application. Evan Coury - http://evan.pro/zf2-modules-talk.html 10
  • 11. A re-usable piece of functionality that can be used to construct a more complex application. Evan Coury - http://evan.pro/zf2-modules-talk.html 11
  • 12. Cosa posso riutilizzare? Sito Web contenuti statici, catalogo servizi, form contatti, ecc. Modello Amministrazione sito Web gestione contenuti statici, catalogo servizi, form contatti, ecc. 12
  • 13. Cosa posso riutilizzare? Sito Web contenuti statici, catalogo servizi, form contatti, ecc. Modello Amministrazione sito Web gestione contenuti statici, catalogo servizi, form contatti, ecc. 13
  • 14. Pensiamo alle funzionalità Sito Web Contenuti e pagine Modello statiche Amministrazione sito Web 14
  • 15. Pensiamo alle funzionalità Sito Web Contenuti Catalogo Form e pagine servizi contatti Modello statiche Amministrazione sito Web 15
  • 16. Ecco i moduli! Sito Web Contenuti Catalogo Form e pagine servizi contatti Modello statiche Amministrazione sito Web 16
  • 17. OK, MA IN CONCRETO?
  • 18. Namespace Module.php Modulo 18
  • 19. Namespace Module.php Modulo Namespace MioModulo; Class Module {} 19
  • 20. Cosa possiamo farci? Formattare una Mostrare una valuta form di contatto 20
  • 21. Cosa possiamo farci? Formattare una Mostrare una valuta form di contatto Gestire utenti e Integrare un ACL ORM 21
  • 22. Cosa possiamo farci? Formattare una Mostrare una valuta form di contatto Gestire utenti e Integrare un ACL ORM Inglobare tutta l’applicazione 22
  • 23. Cosa possiamo farci? Formattare una Mostrare una valuta form di contatto Gestire utenti e Integrare un ACL ORM Inglobare tutta l’applicazione 23
  • 24. PROVIAMO A CAPIRCI QUALCOSA
  • 25. Dove si trovano? Moduli dell’applicazione Moduli di terze parti 25
  • 26. Da dove partiamo? http://modules.zendframework.com/ 26
  • 27. Com’è fatto un modulo configurazioni 27
  • 28. File di configurazione // config/module.config.php return array( 'router' => array( 'routes' => array(...) ), 'controllers' => array(...), 'service_manager' => array(...), 'view_manager' => array(...), ... )
  • 29. Com’è fatto un modulo file PHP del modulo (Controller, Form, Modello, Servizi, ecc.) 29
  • 30. Com’è fatto un modulo File per il test del modulo 30
  • 31. Com’è fatto un modulo tutto ciò che riguarda le viste (pagine, layout, partials) 31
  • 32. Attivazione di un modulo config/application.config.php return array( 'modules' => array( 'DoctrineModule', 'DoctrineORMModule', 'SpeckPaypal', 'Application', ), ), ... 32
  • 33. Attivazione di un modulo config/application.config.php return array( 'modules' => array( 'DoctrineModule', 'DoctrineORMModule', 'SpeckPaypal', Attenzione 'Application', all’ordinamento ), ), ... 33
  • 35. Posso fare l’override… …di viste / layout return array( ... 'view_manager' => array( ... ), ) 35
  • 36. Posso fare l’override… …di viste / layout return array( ... …del routing 'router' => array( ... ), ) 36
  • 37. Posso fare l’override… …di viste / layout …del routing …di tutte le configurazioni 37
  • 38. Posso fare l’override… …di viste / layout …del routing …di tutte le configurazioni estendendo, non modificando il modulo originale 38
  • 43. 1 - COME ORGANIZZO I MODULI?
  • 44. Di cosa ho bisogno? 44
  • 45. Di cosa ho bisogno? • Catalogo prodotti • Carrello • Checkout (e pagamento) • Pagine (più o meno statiche) • Pannello amministrativo 45
  • 46. Di cosa ho bisogno? • Catalogo prodotti • Carrello Un modulo • Checkout (e pagamento) ciascuno • Pagine (più o meno statiche) • Pannello amministrativo 46
  • 47. Di cosa ho bisogno? • Catalogo prodotti • Carrello Un modulo • Checkout (e pagamento) ciascuno • Pagine (più o meno statiche) • Pannello amministrativo «orizzontale» rispetto agli altri moduli (lasciamolo un attimo in sospeso…) 47
  • 49. Condivisi Librerie javascript, loghi, pulsanti, CSS, ecc. 49
  • 50. Condivisi Librerie javascript, loghi, pulsanti, CSS, ecc. Dove li mettiamo? 50
  • 51. Condivisi Librerie javascript, loghi, pulsanti, CSS, ecc. Dove li mettiamo? Dentro cartella /public? 51
  • 52. Esclusivi Librerie javascript, immagini e CSS che servono solo ad un singolo modulo 52
  • 53. Esclusivi Librerie javascript, immagini e CSS che servono solo ad un singolo modulo Dove li mettiamo? 53
  • 54. Esclusivi Librerie javascript, immagini e CSS che servono solo ad un singolo modulo Dove li mettiamo? Dentro ciascun modulo! 54
  • 55. Soluzioni? • Copia & incolla dei file dentro la cartella public? • Symlinks? • Configurare apache per «cercare» i file fra i vari moduli? 55
  • 57. Esistono anche alternative, ad esempio… 57
  • 58. Modulo AssetManager Assets Asset Manager 58
  • 59. Resolvers Assets Asset Filters Manager 59
  • 60. Resolvers Assets Asset Filters Manager Cache 60
  • 61. Dove mettiamo gli asset? tutti gli asset del modulo 61
  • 62. module.config.php return array( 'asset_manager' => array( 'resolver_configs' => array( 'paths' => array( __DIR__ . '/../assets', ), ),),), ...
  • 63. module.config.php return array( 'asset_manager' => array( 'resolver_configs' => array( 'paths' => array( __DIR__ . '/../assets', ), ),),), ... layout.php echo $this->headLink() ->prependStylesheet($this->basePath() . '/css/miocss.css');
  • 64. module.config.php return array( 'asset_manager' => array( 'resolver_configs' => array( 'map' => array( 'css/primo.css' => __DIR__.'/../assets/css/primo.css', 'css/secondo.css' => __DIR__.'/../assets/css/secondo.css', ), 'collections' => array( 'css/merge.css' => array( 'css/primo.css','css/secondo.css', ),),),),), ...
  • 65. module.config.php return array( 'asset_manager' => array( 'resolver_configs' => array( 'map' => array( 'css/primo.css' => __DIR__.'/../assets/css/primo.css', 'css/secondo.css' => __DIR__.'/../assets/css/secondo.css', ), 'collections' => array( 'css/merge.css' => array( 'css/primo.css','css/secondo.css', ),),),),), ... layout.php echo $this->headLink() ->prependStylesheet($this->basePath() . '/css/merge.css');
  • 66. Ora il modulo è davvero riusabile! 66
  • 68. Catalogo Carrello 68
  • 69. Catalogo Carrello moduli Prodotto (con la sua entità del modello, i mappers, i servizi, ecc.) 69
  • 70. Catalogo Carrello moduli Prodotto - id - nome - prezzo 70
  • 71. Catalogo Carrello ? ? Prodotto - id - nome - prezzo 71
  • 72. Modulo «carrello», vorrei: • Vederlo all’opera standalone, senza altre dipendenze 72
  • 73. Modulo «carrello», vorrei: • Vederlo all’opera standalone, senza altre dipendenze • Poter gestire prodotti diversi 73
  • 74. Modulo «carrello», vorrei: • Vederlo all’opera standalone, senza altre dipendenze • Poter gestire prodotti diversi • Poter definire dei «vincoli» su logica e campi (almeno nome + prezzo) 74
  • 75. Il carrello vuole un prodotto con certe caratteristiche... 75
  • 76. Carrello Prodotto - id - nome - prezzo 76
  • 77. Catalogo Carrello Prodotto Prodotto - id - id - nome - nome - prezzo - prezzo - dimensioneSchermo - RAM - prezzoOfferta - … 77
  • 78. Catalogo Carrello Prodotto - id - nome - prezzo - dimensioneSchermo - RAM - prezzoOfferta - … 78
  • 79. Come? Con il Service Manager /* Modulo Carrello – module.config.php */ return array( 'router' => array(…), 'controllers' => array(…), 'service_manager' => array( 'invokables' => array( 'EcommerceService' => 'CarrelloServiceEcommerceService', 'ProductService' => 'CarrelloServiceProductService', ), 'factories' => array(…) ) );
  • 80. ProductService /* Modulo Carrello – EcommerceServiceProductService */ class ProductService implements ... { public function getProduct($i_product) { $I_repository = $this->getEntityManager() ->getRepository('CarrelloEntityCartproduct'); return $I_repository->find($i_product); } }
  • 81. Nel modulo «catalogo»? Override! /* Modulo Catalogo – module.config.php */ return array( 'router' => array(…), 'controllers' => array(…), 'service_manager' => array( 'invokables' => array( 'ProductService' => 'CatalogServiceMyProductService', ), 'factories' => array(…) ) );
  • 82. Nel modulo «catalogo»? Override! /* Modulo Catalogo – module.config.php */ return array( 'router' => array(…), 'controllers' => array(…), 'service_manager' => array( 'invokables' => array( 'ProductService' => 'CatalogServiceMyProductService', ), 'factories' => array(…) ) );
  • 83. E i «vincoli» (es. nome + prezzo)?
  • 84. E i «vincoli» (es. nome + prezzo)? Ereditarietà di classe /** * CatalogEntityProduct * ... */ class Product extends EcommerceEntityCartproduct {} O implementando interfaccia /** * CatalogEntityProduct * ... */ class Product implements EcommerceEntityCartproductInterface {}
  • 85. Catalogo Carrello Prodotto id, nome, prezzo dimensioneSchermo, RAM, prezzoOfferta, … Servizi, mapper, comportamenti, … 85
  • 86. Ora il modulo è davvero riusabile! 86
  • 88. Ho bisogno di un’altra cartella /public? 88
  • 89. Ho bisogno di un’altra cartella /public? Probabilmente no (a meno di casi particolari) 89
  • 90. Creo un modulo per tutta la parte amministrativa? 90
  • 91. Creo un modulo per tutta la parte amministrativa? Potrei… ma non sarebbe riusabile (né lui né gli altri moduli) 91
  • 92. Inglobo la parte amministrativa dentro ciascun modulo? 92
  • 93. Inglobo la parte amministrativa dentro ciascun modulo? Esatto! O almeno nella maggioranza dei casi 93
  • 94. Da dove eravamo partiti… Sito Web Contenuti Catalogo Form e pagine servizi contatti Modello statiche Amministrazione sito Web 94
  • 95. Ciò che voglio: http://mio.si.to/admin http://mio.si.to/admin/catalog http://mio.si.to/admin/user http://mio.si.to/admin/purchase … 95
  • 96. Come? Un modulo di 96
  • 97. 1. Attivazione modulo /* application.config.php */ return array( 'modules' => array(…), 'ZfcAdmin', 'Application', ), );
  • 99. 3. Configurazione routing /* Modulo Catalog – module.config.php */ return array( 'router' => array( 'zfcadmin' => array( 'child_routes' => array( 'catalog' => array( 'type' => 'Literal', 'options' => array( 'route' => '/catalog', 'defaults' => array( 'controller' => 'CatalogControllerAdmin', 'action' => 'index', ), ),),),), ), );
  • 100. 3. Configurazione routing /* Modulo Catalog – module.config.php */ return array( 'router' => array( 'zfcadmin' => array( 'child_routes' => array( 'catalog' => array( 'type' => 'Literal', 'options' => array( 'route' => '/catalog', 'defaults' => array( 'controller' => 'CatalogControllerAdmin', 'action' => 'index', ), ),),),), ), );
  • 101. 3. Configurazione routing /* Modulo Catalog – module.config.php */ return array( 'router' => array( 'zfcadmin' => array( 'child_routes' => array( /admin/catalog 'catalog' => array( 'type' => 'Literal', 'options' => array( 'route' => '/catalog', 'defaults' => array( 'controller' => 'CatalogControllerAdmin', 'action' => 'index', ), ),),),), ), );
  • 102. Il pannello admin del modulo è pronto! 102
  • 103. Il pannello admin del modulo è pronto! e l’autenticazione? 103
  • 104. Autenticazione + 104
  • 105. Gestione autorizzazioni /* Modulo AppCatalog – module.config.php */ return array( … 'bjyauthorize' => array( 'guards' => array( 'BjyAuthorizeGuardRoute' => array( array('route' => 'zfcadmin/catalog', 'roles' => array('user')), ), ), ), );
  • 107.
  • 108.
  • 111. Grazie per l’attenzione Stefano Valle @stefanovalle s.valle@mvassociati.it
  • 113. Photo Credits • http://www.flickr.com/photos/10459273@N05/4771563267 • http://www.flickr.com/photos/vittoriomilanes/8286559013 • http://www.flickr.com/photos/criminalintent/5101528210 • http://www.flickr.com/photos/billward/5626976800 • http://www.flickr.com/photos/frikitiki/3751108796 • http://www.flickr.com/photos/billward/5626389173 • http://www.flickr.com/photos/jlz/4275224658 • http://www.flickr.com/photos/slackpics/4289782818 • http://www.flickr.com/photos/pullip_junk/6624713631 • http://www.flickr.com/photos/nasahqphoto/5162244810 • http://www.flickr.com/photos/comedynose/5340477326 • http://www.flickr.com/photos/tracyleephoto/8322509672 • http://www.flickr.com/photos/michelleundihrefotos/5970015736 • http://www.flickr.com/photos/hefhoover/3929261255 • http://www.flickr.com/photos/89544908@N00/7877685112/ 113