Moduli su Zend Framework 2: come sfruttarli

Stefano Valle
Stefano ValleSoftware engineer at MV Labs
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
Moduli su Zend Framework 2: come sfruttarli
Moduli su Zend Framework 2: come sfruttarli
+ 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
1 of 113

Recommended

Require js by
Require jsRequire js
Require jsRajashekar Bhagavatula
475 views17 slides
Zend Framework 2 - PHPUnit by
Zend Framework 2 - PHPUnitZend Framework 2 - PHPUnit
Zend Framework 2 - PHPUnitTarun Kumar Singhal
3.4K views23 slides
Error Reporting in ZF2: form messages, custom error pages, logging by
Error Reporting in ZF2: form messages, custom error pages, loggingError Reporting in ZF2: form messages, custom error pages, logging
Error Reporting in ZF2: form messages, custom error pages, loggingSteve Maraspin
17.8K views136 slides
Introduzione a Git by
Introduzione a GitIntroduzione a Git
Introduzione a GitStefano Valle
2.5K views82 slides
Zend Framework Workshop Parte2 by
Zend Framework Workshop Parte2Zend Framework Workshop Parte2
Zend Framework Workshop Parte2massimiliano.wosz
426 views12 slides
GAME ON! Integrating Games and Simulations in the Classroom by
GAME ON! Integrating Games and Simulations in the Classroom GAME ON! Integrating Games and Simulations in the Classroom
GAME ON! Integrating Games and Simulations in the Classroom Brian Housand
230.4K views98 slides

More Related Content

Similar to Moduli su Zend Framework 2: come sfruttarli

Giovambattista Fazioli, 10 more things by
Giovambattista Fazioli, 10 more thingsGiovambattista Fazioli, 10 more things
Giovambattista Fazioli, 10 more thingsKnowCamp
501 views39 slides
Come portare il profiler di symfony2 in drupal8 by
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Luca Lusso
1K views41 slides
Introduzione al Domain Driven Design (DDD) by
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)DotNetMarche
1.1K views45 slides
Yii Framework - yes it is rapid web application development (Parte 1) by
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
2.4K views35 slides
Sa framework by
Sa frameworkSa framework
Sa frameworkArnaldo Colombo
566 views51 slides
Asp.NET MVC Framework by
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC FrameworkDotNetMarche
616 views40 slides

Similar to Moduli su Zend Framework 2: come sfruttarli(20)

Giovambattista Fazioli, 10 more things by KnowCamp
Giovambattista Fazioli, 10 more thingsGiovambattista Fazioli, 10 more things
Giovambattista Fazioli, 10 more things
KnowCamp501 views
Come portare il profiler di symfony2 in drupal8 by Luca Lusso
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8
Luca Lusso1K views
Introduzione al Domain Driven Design (DDD) by DotNetMarche
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)
DotNetMarche1.1K views
Yii Framework - yes it is rapid web application development (Parte 1) by brossi676
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)
brossi6762.4K views
Asp.NET MVC Framework by DotNetMarche
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC Framework
DotNetMarche616 views
Design Patterns - enterprise patterns (part I) by Fabio Armani
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)
Fabio Armani3.2K views
Introduzione a Drupal - Versione Italiana by Giovanni Buffa
Introduzione a Drupal - Versione ItalianaIntroduzione a Drupal - Versione Italiana
Introduzione a Drupal - Versione Italiana
Giovanni Buffa323 views
DotNetToscana - Sessione TypeScript by Sinergia Totale
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
Sinergia Totale638 views
Migliora il tuo codice con knockout.js by Andrea Dottor
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.js
Andrea Dottor2.1K views
We Want Web - Web Applications con MVC 3 by DomusDotNet
We Want Web - Web Applications con MVC 3We Want Web - Web Applications con MVC 3
We Want Web - Web Applications con MVC 3
DomusDotNet353 views
Drupal 4 stakeholder by bmeme
Drupal 4 stakeholderDrupal 4 stakeholder
Drupal 4 stakeholder
bmeme431 views
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B by kino2k
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
kino2k1.8K views
Drupal diventa un CMF e WordPress che fa? Slide WordCamp Milano 2019 by Matteo Enna
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
Matteo Enna44 views
Designing the User Experience by Fulvio Corno
Designing the User ExperienceDesigning the User Experience
Designing the User Experience
Fulvio Corno622 views
Tra Design e interattività : Come progettare un sito web by Estensa Srl
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
Estensa Srl960 views
Rendere flessibili e trasformare architetture IT di vecchio tipo: passaggio d... by Emanuele Della Valle
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...

More from Stefano Valle

IoT: protocolli, dispositivi, architetture by
IoT: protocolli, dispositivi, architettureIoT: protocolli, dispositivi, architetture
IoT: protocolli, dispositivi, architettureStefano Valle
148 views151 slides
Protocol Rollercoaster: da HTTP a AMQP, passando per CoAP e MQTT by
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
407 views135 slides
Instant ACLs with Zend Framework 2 by
Instant ACLs with Zend Framework 2Instant ACLs with Zend Framework 2
Instant ACLs with Zend Framework 2Stefano Valle
21.6K views137 slides
NoSQL Containers get Rich by
NoSQL Containers get RichNoSQL Containers get Rich
NoSQL Containers get RichStefano Valle
1.8K views99 slides
Asset management with Zend Framework 2 by
Asset management with Zend Framework 2Asset management with Zend Framework 2
Asset management with Zend Framework 2Stefano Valle
7.6K views20 slides
Stime e preventivi in un contesto di sviluppo agile by
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
1.1K views84 slides

More from Stefano Valle(7)

IoT: protocolli, dispositivi, architetture by Stefano Valle
IoT: protocolli, dispositivi, architettureIoT: protocolli, dispositivi, architetture
IoT: protocolli, dispositivi, architetture
Stefano Valle148 views
Protocol Rollercoaster: da HTTP a AMQP, passando per CoAP e MQTT by Stefano Valle
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
Stefano Valle407 views
Instant ACLs with Zend Framework 2 by Stefano Valle
Instant ACLs with Zend Framework 2Instant ACLs with Zend Framework 2
Instant ACLs with Zend Framework 2
Stefano Valle21.6K views
NoSQL Containers get Rich by Stefano Valle
NoSQL Containers get RichNoSQL Containers get Rich
NoSQL Containers get Rich
Stefano Valle1.8K views
Asset management with Zend Framework 2 by Stefano Valle
Asset management with Zend Framework 2Asset management with Zend Framework 2
Asset management with Zend Framework 2
Stefano Valle7.6K views
Stime e preventivi in un contesto di sviluppo agile by Stefano Valle
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
Stefano Valle1.1K views
Introduzione alle metodologie di sviluppo agile by Stefano Valle
Introduzione alle metodologie di sviluppo agileIntroduzione alle metodologie di sviluppo agile
Introduzione alle metodologie di sviluppo agile
Stefano Valle4.8K views

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