113
Arrivano i moduli come li sfruttiamo? Zend Framework Day – Milano – 01/02/2013

Moduli su Zend Framework 2: come sfruttarli

Embed Size (px)

DESCRIPTION

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.

Citation preview

Page 1: Moduli su Zend Framework 2: come sfruttarli

Arrivano i modulicome li sfruttiamo?

Zend Framework Day – Milano – 01/02/2013

Page 2: Moduli su Zend Framework 2: come sfruttarli

@stefanovalle

Page 3: Moduli su Zend Framework 2: come sfruttarli

http://www.mvassociati.it/

Page 4: Moduli su Zend Framework 2: come sfruttarli

http://friuli.grusp.org/

Page 5: Moduli su Zend Framework 2: come sfruttarli

I MODULI DI ZF2

Page 6: Moduli su Zend Framework 2: come sfruttarli

I moduli, come li conosciamo in ZF1

6

Sito Webcontenuti statici, catalogo servizi, form contatti, ecc.

Page 7: Moduli su Zend Framework 2: come sfruttarli

I moduli, come li conosciamo in ZF1

7

Sito Webcontenuti statici, catalogo servizi, form contatti, ecc.

Amministrazione sito Webgestione contenuti statici, catalogo servizi, form contatti, ecc.

Page 8: Moduli su Zend Framework 2: come sfruttarli

I moduli, come li conosciamo in ZF1

8

Sito Webcontenuti statici, catalogo servizi, form contatti, ecc.

Modello

Amministrazione sito Webgestione contenuti statici, catalogo servizi, form contatti, ecc.

Page 9: Moduli su Zend Framework 2: come sfruttarli

E IN ZF2?

Page 10: Moduli su Zend Framework 2: come sfruttarli

A re-usable piece of functionality that can be used to construct a more complex

application.

10

Evan Coury - http://evan.pro/zf2-modules-talk.html

Page 11: Moduli su Zend Framework 2: come sfruttarli

A re-usable piece of functionality that can be used to construct a more complex

application.

11

Evan Coury - http://evan.pro/zf2-modules-talk.html

Page 12: Moduli su Zend Framework 2: come sfruttarli

Cosa posso riutilizzare?

12

Sito Webcontenuti statici, catalogo servizi, form contatti, ecc.

Modello

Amministrazione sito Webgestione contenuti statici, catalogo servizi, form contatti, ecc.

Page 13: Moduli su Zend Framework 2: come sfruttarli

Cosa posso riutilizzare?

13

Sito Webcontenuti statici, catalogo servizi, form contatti, ecc.

Modello

Amministrazione sito Webgestione contenuti statici, catalogo servizi, form contatti, ecc.

Page 14: Moduli su Zend Framework 2: come sfruttarli

Pensiamo alle funzionalità

14

Sito Web

Modello

Amministrazione sito Web

Contenuti e pagine statiche

Page 15: Moduli su Zend Framework 2: come sfruttarli

Pensiamo alle funzionalità

15

Sito Web

Modello

Amministrazione sito Web

Contenuti e pagine statiche

Catalogo servizi

Form contatti

Page 16: Moduli su Zend Framework 2: come sfruttarli

Ecco i moduli!

16

Sito Web

Modello

Amministrazione sito Web

Contenuti e pagine statiche

Catalogo servizi

Form contatti

Page 17: Moduli su Zend Framework 2: come sfruttarli

OK, MA IN CONCRETO?

Page 18: Moduli su Zend Framework 2: come sfruttarli

18

Namespace Module.php Modulo

Page 19: Moduli su Zend Framework 2: come sfruttarli

19

Namespace MioModulo;

Class Module {}

Namespace Module.php Modulo

Page 20: Moduli su Zend Framework 2: come sfruttarli

Cosa possiamo farci?

20

Formattare una valuta

Mostrare una form di contatto

Page 21: Moduli su Zend Framework 2: come sfruttarli

Cosa possiamo farci?

21

Formattare una valuta

Mostrare una form di contatto

Gestire utenti e ACL

Integrare un ORM

Page 22: Moduli su Zend Framework 2: come sfruttarli

Cosa possiamo farci?

22

Formattare una valuta

Mostrare una form di contatto

Gestire utenti e ACL

Integrare un ORM

Inglobare tutta l’applicazione

Page 23: Moduli su Zend Framework 2: come sfruttarli

Cosa possiamo farci?

23

Formattare una valuta

Mostrare una form di contatto

Gestire utenti e ACL

Integrare un ORM

Inglobare tutta l’applicazione

Page 24: Moduli su Zend Framework 2: come sfruttarli

PROVIAMO A CAPIRCI QUALCOSA

Page 25: Moduli su Zend Framework 2: come sfruttarli

Dove si trovano?

25

Moduli di terze parti

Moduli dell’applicazione

Page 26: Moduli su Zend Framework 2: come sfruttarli

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

26

Page 27: Moduli su Zend Framework 2: come sfruttarli

Com’è fatto un modulo

27

configurazioni

Page 28: Moduli su Zend Framework 2: come sfruttarli

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

return array(

'router' => array(

'routes' => array(...)

),

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

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

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

...

)

Page 29: Moduli su Zend Framework 2: come sfruttarli

Com’è fatto un modulo

29

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

Page 30: Moduli su Zend Framework 2: come sfruttarli

Com’è fatto un modulo

30

File per il test del modulo

Page 31: Moduli su Zend Framework 2: come sfruttarli

Com’è fatto un modulo

31

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

Page 32: Moduli su Zend Framework 2: come sfruttarli

Attivazione di un modulo

32

return array(

'modules' => array(

'DoctrineModule',

'DoctrineORMModule',

'SpeckPaypal',

'Application',

),

),

...

config/application.config.php

Page 33: Moduli su Zend Framework 2: come sfruttarli

Attivazione di un modulo

33

return array(

'modules' => array(

'DoctrineModule',

'DoctrineORMModule',

'SpeckPaypal',

'Application',

),

),

...

config/application.config.php

Attenzione all’ordinamento

Page 34: Moduli su Zend Framework 2: come sfruttarli

MERGE DELLA CONFIGURAZIONE

Page 35: Moduli su Zend Framework 2: come sfruttarli

Posso fare l’override……di viste / layout

35

return array(

...

'view_manager' => array(

...

),

)

Page 36: Moduli su Zend Framework 2: come sfruttarli

Posso fare l’override……di viste / layout…del routing

36

return array(

...

'router' => array(

...

),

)

Page 37: Moduli su Zend Framework 2: come sfruttarli

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

37

Page 38: Moduli su Zend Framework 2: come sfruttarli

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

38

estendendo, non modificando il modulo originale

Page 39: Moduli su Zend Framework 2: come sfruttarli

RIUSABILI

Page 40: Moduli su Zend Framework 2: come sfruttarli

Realizziamo un E-Commerce

40

Page 41: Moduli su Zend Framework 2: come sfruttarli

DIAMO UN’OCCHIATA IN GIRO…

Page 42: Moduli su Zend Framework 2: come sfruttarli

DUBBI INCONTRATI

Page 43: Moduli su Zend Framework 2: come sfruttarli

1 - COME ORGANIZZO I MODULI?

Page 44: Moduli su Zend Framework 2: come sfruttarli

Di cosa ho bisogno?

44

Page 45: Moduli su Zend Framework 2: come sfruttarli

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

45

Page 46: Moduli su Zend Framework 2: come sfruttarli

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

46

Un modulo ciascuno

Page 47: Moduli su Zend Framework 2: come sfruttarli

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

47

Un modulo ciascuno

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

Page 48: Moduli su Zend Framework 2: come sfruttarli

2) IMMAGINI/JS/CSS

Page 49: Moduli su Zend Framework 2: come sfruttarli

CondivisiLibrerie javascript, loghi, pulsanti, CSS, ecc.

49

Page 50: Moduli su Zend Framework 2: come sfruttarli

CondivisiLibrerie javascript, loghi, pulsanti, CSS, ecc.

50

Dove li mettiamo?

Page 51: Moduli su Zend Framework 2: come sfruttarli

CondivisiLibrerie javascript, loghi, pulsanti, CSS, ecc.

51

Dove li mettiamo?Dentro cartella /public?

Page 52: Moduli su Zend Framework 2: come sfruttarli

EsclusiviLibrerie javascript, immagini e CSS che servono solo ad un singolo modulo

52

Page 53: Moduli su Zend Framework 2: come sfruttarli

EsclusiviLibrerie javascript, immagini e CSS che servono solo ad un singolo modulo

53

Dove li mettiamo?

Page 54: Moduli su Zend Framework 2: come sfruttarli

EsclusiviLibrerie javascript, immagini e CSS che servono solo ad un singolo modulo

54

Dove li mettiamo?Dentro ciascun modulo!

Page 55: Moduli su Zend Framework 2: come sfruttarli

Soluzioni?• Copia & incolla dei file dentro la cartella

public?• Symlinks?• Configurare apache per «cercare» i file fra

i vari moduli?

55

Page 56: Moduli su Zend Framework 2: come sfruttarli

Meglio: modulo AssetManager

56

Page 57: Moduli su Zend Framework 2: come sfruttarli

Esistono anche alternative, ad esempio…

57

Page 58: Moduli su Zend Framework 2: come sfruttarli

58

AssetManager

Assets

Modulo AssetManager

Page 59: Moduli su Zend Framework 2: come sfruttarli

59

AssetManager

Resolvers

FiltersAssets

Page 60: Moduli su Zend Framework 2: come sfruttarli

60

AssetManager

Resolvers

Filters

Cache

Assets

Page 61: Moduli su Zend Framework 2: come sfruttarli

Dove mettiamo gli asset?

61

tutti gli assetdel modulo

Page 62: Moduli su Zend Framework 2: come sfruttarli

module.config.php

return array(

'asset_manager' => array(

'resolver_configs' => array(

'paths' => array(

__DIR__ . '/../assets',

),

),),), ...

Page 63: Moduli su Zend Framework 2: come sfruttarli

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

Page 64: Moduli su Zend Framework 2: come sfruttarli

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

Page 65: Moduli su Zend Framework 2: come sfruttarli

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

module.config.php

Page 66: Moduli su Zend Framework 2: come sfruttarli

Ora il modulo è davvero riusabile!

66

Page 67: Moduli su Zend Framework 2: come sfruttarli

3) ENTITA’ CONDIVISE

Page 68: Moduli su Zend Framework 2: come sfruttarli

Catalogo

68

Carrello

Page 69: Moduli su Zend Framework 2: come sfruttarli

69

Prodotto

(con la sua entità del modello, i mappers, i

servizi, ecc.)

Catalogo Carrellomoduli

Page 70: Moduli su Zend Framework 2: come sfruttarli

70

Prodotto- id- nome- prezzo

Catalogo Carrellomoduli

Page 71: Moduli su Zend Framework 2: come sfruttarli

71

Catalogo Carrello

? ?Prodotto

- id- nome- prezzo

Page 72: Moduli su Zend Framework 2: come sfruttarli

Modulo «carrello», vorrei:• Vederlo all’opera standalone,

senza altre dipendenze

72

Page 73: Moduli su Zend Framework 2: come sfruttarli

Modulo «carrello», vorrei:• Vederlo all’opera standalone,

senza altre dipendenze• Poter gestire prodotti diversi

73

Page 74: Moduli su Zend Framework 2: come sfruttarli

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

Page 75: Moduli su Zend Framework 2: come sfruttarli

Il carrello vuole un prodotto con certe caratteristiche...

75

Page 76: Moduli su Zend Framework 2: come sfruttarli

76

Carrello

Prodotto- id- nome- prezzo

Page 77: Moduli su Zend Framework 2: come sfruttarli

Catalogo

77

Carrello

- dimensioneSchermo- RAM- prezzoOfferta- …

Prodotto- id- nome- prezzo

Prodotto- id- nome- prezzo

Page 78: Moduli su Zend Framework 2: come sfruttarli

Catalogo

78

Carrello

- dimensioneSchermo- RAM- prezzoOfferta- …

Prodotto- id- nome- prezzo

Page 79: Moduli su Zend Framework 2: come sfruttarli

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

return array(

'router' => array(…),

'controllers' => array(…),

'service_manager' => array(

'invokables' => array(

'EcommerceService' => 'Carrello\Service\EcommerceService',

'ProductService' => 'Carrello\Service\ProductService',

),

'factories' => array(…)

)

);

Page 80: Moduli su Zend Framework 2: come sfruttarli

ProductService/* Modulo Carrello – Ecommerce\Service\ProductService */

class ProductService implements ... {

public function getProduct($i_product) {

$I_repository = $this->getEntityManager()

->getRepository('Carrello\Entity\Cartproduct');

return $I_repository->find($i_product);

}

}

Page 81: Moduli su Zend Framework 2: come sfruttarli

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

return array(

'router' => array(…),

'controllers' => array(…),

'service_manager' => array(

'invokables' => array(

'ProductService' => 'Catalog\Service\MyProductService',

),

'factories' => array(…)

)

);

Page 82: Moduli su Zend Framework 2: come sfruttarli

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

return array(

'router' => array(…),

'controllers' => array(…),

'service_manager' => array(

'invokables' => array(

'ProductService' => 'Catalog\Service\MyProductService',

),

'factories' => array(…)

)

);

Page 83: Moduli su Zend Framework 2: come sfruttarli

E i «vincoli» (es. nome + prezzo)?

Page 84: Moduli su Zend Framework 2: come sfruttarli

/**

* Catalog\Entity\Product

* ...

*/

class Product extends \Ecommerce\Entity\Cartproduct {}

Ereditarietà di classe

/**

* Catalog\Entity\Product

* ...

*/

class Product implements \Ecommerce\Entity\CartproductInterface {}

O implementando interfaccia

E i «vincoli» (es. nome + prezzo)?

Page 85: Moduli su Zend Framework 2: come sfruttarli

Catalogo

85

Carrello

dimensioneSchermo, RAM, prezzoOfferta,

Prodottoid, nome, prezzo

Servizi, mapper, comportamenti, …

Page 86: Moduli su Zend Framework 2: come sfruttarli

86

Ora il modulo è davvero riusabile!

Page 87: Moduli su Zend Framework 2: come sfruttarli

PROBLEMA 4: PANNELLO ADMIN

Page 88: Moduli su Zend Framework 2: come sfruttarli

Ho bisogno di un’altra cartella

/public?

88

Page 89: Moduli su Zend Framework 2: come sfruttarli

Ho bisogno di un’altra cartella

/public?

89

Probabilmente no(a meno di casi particolari)

Page 90: Moduli su Zend Framework 2: come sfruttarli

Creo un modulo per tutta la parte amministrativa?

90

Page 91: Moduli su Zend Framework 2: come sfruttarli

Creo un modulo per tutta la parte amministrativa?

91

Potrei… ma non sarebbe riusabile

(né lui né gli altri moduli)

Page 92: Moduli su Zend Framework 2: come sfruttarli

Inglobo la parte amministrativa dentro ciascun modulo?

92

Page 93: Moduli su Zend Framework 2: come sfruttarli

Inglobo la parte amministrativa dentro ciascun modulo?

93

Esatto!O almeno nella maggioranza dei casi

Page 94: Moduli su Zend Framework 2: come sfruttarli

Da dove eravamo partiti…

94

Sito Web

Modello

Amministrazione sito Web

Contenuti e pagine statiche

Catalogo servizi

Form contatti

Page 95: Moduli su Zend Framework 2: come sfruttarli

Ciò che voglio:http://mio.si.to/adminhttp://mio.si.to/admin/cataloghttp://mio.si.to/admin/userhttp://mio.si.to/admin/purchase…

95

Page 96: Moduli su Zend Framework 2: come sfruttarli

Come?

96

Un modulo di

Page 97: Moduli su Zend Framework 2: come sfruttarli

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

return array(

'modules' => array(…),

'ZfcAdmin',

'Application',

),

);

Page 98: Moduli su Zend Framework 2: come sfruttarli

2. Creazione controller

98

Page 99: Moduli su Zend Framework 2: come sfruttarli

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' => 'Catalog\Controller\Admin',

'action' => 'index',

),

),),),),

),

);

Page 100: Moduli su Zend Framework 2: come sfruttarli

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' => 'Catalog\Controller\Admin',

'action' => 'index',

),

),),),),

),

);

Page 101: Moduli su Zend Framework 2: come sfruttarli

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' => 'Catalog\Controller\Admin',

'action' => 'index',

),

),),),),

),

);

/admin/catalog

Page 102: Moduli su Zend Framework 2: come sfruttarli

Il pannello admin del modulo è pronto!

102

Page 103: Moduli su Zend Framework 2: come sfruttarli

103

e l’autenticazione?

Il pannello admin del modulo è pronto!

Page 104: Moduli su Zend Framework 2: come sfruttarli

Autenticazione

104

+

Page 105: Moduli su Zend Framework 2: come sfruttarli

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

return array(

'bjyauthorize' => array(

'guards' => array(

'BjyAuthorize\Guard\Route' => array(

array('route' => 'zfcadmin/catalog',

'roles' => array('user')),

),

),

),

);

Page 106: Moduli su Zend Framework 2: come sfruttarli

Tiriamo le somme

106

Page 107: Moduli su Zend Framework 2: come sfruttarli
Page 108: Moduli su Zend Framework 2: come sfruttarli
Page 109: Moduli su Zend Framework 2: come sfruttarli

+ RIUSO

Page 110: Moduli su Zend Framework 2: come sfruttarli

APPLICAZIONI CUSTOM

Page 111: Moduli su Zend Framework 2: come sfruttarli

Stefano [email protected]@mvassociati.it

Grazie per l’attenzione

Page 112: Moduli su Zend Framework 2: come sfruttarli

DOMANDE?

Page 113: Moduli su Zend Framework 2: come sfruttarli

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