Moduli su Zend Framework 2: come sfruttarli

  • 2,068 views
Uploaded on

Presentazione sui moduli introdotti in Zend Framework 2, tenuta allo Zend Framework Day del 01/02/2013 a Milano. …

Presentazione sui moduli introdotti in Zend Framework 2, tenuta allo Zend Framework Day del 01/02/2013 a Milano.

Come organizzo il mio modello, se le entità di base sono condivise tra più moduli? La mia applicazione ha anche un pannello amministrativo: dove metto viste e file del front-end? Come gestisco le eventuali dipendenze esterne? In questo talk cerco di rispondere a queste e altre domande relative all'organizzazione di un progetto ZF2, condividendo la mia esperienza pratica, i dubbi che mi sono posto, e le soluzioni che ho adottato. Non sempre le risposte sono state scontate, a maggior ragione dato che - quale sviluppatore ZF1 - non ero abituato all'uso dei moduli - così come intesi in ZF2. L'introduzione degli stessi può rappresentare una vera e propria svolta; è però fondamentale organizzare opportunamente il proprio progetto, dato che le reali possibilità di riuso dipendono in buona parte proprio da una buona organizzazione del proprio codice.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,068
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
50
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Arrivano i moduli come li sfruttiamo?Zend Framework Day – Milano – 01/02/2013
  • 2. @stefanovalle
  • 3. http://www.mvassociati.it/
  • 4. http://friuli.grusp.org/
  • 5. I MODULI DI ZF2
  • 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
  • 9. E IN ZF2?
  • 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.html10
  • 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.html11
  • 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 Web14
  • 15. Pensiamo alle funzionalità Sito Web Contenuti Catalogo Form e pagine servizi contatti Modello statiche Amministrazione sito Web15
  • 16. Ecco i moduli! Sito Web Contenuti Catalogo Form e pagine servizi contatti Modello statiche Amministrazione sito Web16
  • 17. OK, MA IN CONCRETO?
  • 18. Namespace Module.php Modulo18
  • 19. Namespace Module.php Modulo Namespace MioModulo; Class Module {}19
  • 20. Cosa possiamo farci? Formattare una Mostrare una valuta form di contatto20
  • 21. Cosa possiamo farci? Formattare una Mostrare una valuta form di contatto Gestire utenti e Integrare un ACL ORM21
  • 22. Cosa possiamo farci? Formattare una Mostrare una valuta form di contatto Gestire utenti e Integrare un ACL ORM Inglobare tutta l’applicazione22
  • 23. Cosa possiamo farci? Formattare una Mostrare una valuta form di contatto Gestire utenti e Integrare un ACL ORM Inglobare tutta l’applicazione23
  • 24. PROVIAMO A CAPIRCI QUALCOSA
  • 25. Dove si trovano? Moduli dell’applicazione Moduli di terze parti25
  • 26. Da dove partiamo? http://modules.zendframework.com/26
  • 27. Com’è fatto un modulo configurazioni27
  • 28. File di configurazione// config/module.config.phpreturn 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 modulo30
  • 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
  • 34. MERGE DELLA CONFIGURAZIONE
  • 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 configurazioni37
  • 38. Posso fare l’override… …di viste / layout …del routing …di tutte le configurazioni estendendo, non modificando il modulo originale38
  • 39. RIUSABILI
  • 40. Realizziamo un E-Commerce40
  • 41. DIAMO UN’OCCHIATA IN GIRO…
  • 42. DUBBI INCONTRATI
  • 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 amministrativo45
  • 46. Di cosa ho bisogno? • Catalogo prodotti • Carrello Un modulo • Checkout (e pagamento) ciascuno • Pagine (più o meno statiche) • Pannello amministrativo46
  • 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
  • 48. 2) IMMAGINI/JS/CSS
  • 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 modulo52
  • 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
  • 56. Meglio: modulo AssetManager56
  • 57. Esistono anche alternative, ad esempio…57
  • 58. Modulo AssetManager Assets Asset Manager58
  • 59. Resolvers Assets Asset Filters Manager59
  • 60. Resolvers Assets Asset Filters Manager Cache60
  • 61. Dove mettiamo gli asset? tutti gli asset del modulo61
  • 62. module.config.phpreturn array( asset_manager => array( resolver_configs => array( paths => array( __DIR__ . /../assets, ),),),), ...
  • 63. module.config.phpreturn 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.phpreturn 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.phpreturn 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
  • 67. 3) ENTITA’ CONDIVISE
  • 68. Catalogo Carrello68
  • 69. Catalogo Carrello moduli Prodotto (con la sua entità del modello, i mappers, i servizi, ecc.)69
  • 70. Catalogo Carrello moduli Prodotto - id - nome - prezzo70
  • 71. Catalogo Carrello ? ? Prodotto - id - nome - prezzo71
  • 72. Modulo «carrello», vorrei: • Vederlo all’opera standalone, senza altre dipendenze72
  • 73. Modulo «carrello», vorrei: • Vederlo all’opera standalone, senza altre dipendenze • Poter gestire prodotti diversi73
  • 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 - prezzo76
  • 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
  • 87. PROBLEMA 4: PANNELLO ADMIN
  • 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 casi93
  • 94. Da dove eravamo partiti… Sito Web Contenuti Catalogo Form e pagine servizi contatti Modello statiche Amministrazione sito Web94
  • 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 di96
  • 97. 1. Attivazione modulo/* application.config.php */return array( modules => array(…), ZfcAdmin, Application, ),);
  • 98. 2. Creazione controller98
  • 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)), ), ), ),);
  • 106. Tiriamo le somme106
  • 107. + RIUSO
  • 108. APPLICAZIONI CUSTOM
  • 109. Grazie per l’attenzioneStefano Valle@stefanovalles.valle@mvassociati.it
  • 110. DOMANDE?
  • 111. 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