Upload
stefano-valle
View
2.598
Download
0
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
Arrivano i modulicome 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
6
Sito Webcontenuti statici, catalogo servizi, form contatti, ecc.
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.
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.
E IN ZF2?
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
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
Cosa posso riutilizzare?
12
Sito Webcontenuti statici, catalogo servizi, form contatti, ecc.
Modello
Amministrazione sito Webgestione contenuti statici, catalogo servizi, form contatti, ecc.
Cosa posso riutilizzare?
13
Sito Webcontenuti statici, catalogo servizi, form contatti, ecc.
Modello
Amministrazione sito Webgestione contenuti statici, catalogo servizi, form contatti, ecc.
Pensiamo alle funzionalità
14
Sito Web
Modello
Amministrazione sito Web
Contenuti e pagine statiche
Pensiamo alle funzionalità
15
Sito Web
Modello
Amministrazione sito Web
Contenuti e pagine statiche
Catalogo servizi
Form contatti
Ecco i moduli!
16
Sito Web
Modello
Amministrazione sito Web
Contenuti e pagine statiche
Catalogo servizi
Form contatti
OK, MA IN CONCRETO?
18
Namespace Module.php Modulo
19
Namespace MioModulo;
Class Module {}
Namespace Module.php Modulo
Cosa possiamo farci?
20
Formattare una valuta
Mostrare una form di contatto
Cosa possiamo farci?
21
Formattare una valuta
Mostrare una form di contatto
Gestire utenti e ACL
Integrare un ORM
Cosa possiamo farci?
22
Formattare una valuta
Mostrare una form di contatto
Gestire utenti e ACL
Integrare un ORM
Inglobare tutta l’applicazione
Cosa possiamo farci?
23
Formattare una valuta
Mostrare una form di contatto
Gestire utenti e ACL
Integrare un ORM
Inglobare tutta l’applicazione
PROVIAMO A CAPIRCI QUALCOSA
Dove si trovano?
25
Moduli di terze parti
Moduli dell’applicazione
Da dove partiamo?http://modules.zendframework.com/
26
Com’è fatto un modulo
27
configurazioni
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
29
file PHP del modulo(Controller, Form, Modello, Servizi, ecc.)
Com’è fatto un modulo
30
File per il test del modulo
Com’è fatto un modulo
31
tutto ciò che riguarda le viste(pagine, layout, partials)
Attivazione di un modulo
32
return array(
'modules' => array(
'DoctrineModule',
'DoctrineORMModule',
'SpeckPaypal',
'Application',
),
),
...
config/application.config.php
Attivazione di un modulo
33
return array(
'modules' => array(
'DoctrineModule',
'DoctrineORMModule',
'SpeckPaypal',
'Application',
),
),
...
config/application.config.php
Attenzione all’ordinamento
MERGE DELLA CONFIGURAZIONE
Posso fare l’override……di viste / layout
35
return array(
...
'view_manager' => array(
...
),
)
Posso fare l’override……di viste / layout…del routing
36
return array(
...
'router' => array(
...
),
)
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
38
estendendo, non modificando il modulo originale
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• Checkout (e pagamento)• Pagine (più o meno statiche)• Pannello amministrativo
46
Un modulo ciascuno
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…)
2) IMMAGINI/JS/CSS
CondivisiLibrerie javascript, loghi, pulsanti, CSS, ecc.
49
CondivisiLibrerie javascript, loghi, pulsanti, CSS, ecc.
50
Dove li mettiamo?
CondivisiLibrerie javascript, loghi, pulsanti, CSS, ecc.
51
Dove li mettiamo?Dentro cartella /public?
EsclusiviLibrerie javascript, immagini e CSS che servono solo ad un singolo modulo
52
EsclusiviLibrerie javascript, immagini e CSS che servono solo ad un singolo modulo
53
Dove li mettiamo?
EsclusiviLibrerie javascript, immagini e CSS che servono solo ad un singolo modulo
54
Dove li mettiamo?Dentro ciascun modulo!
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
58
AssetManager
Assets
Modulo AssetManager
59
AssetManager
Resolvers
FiltersAssets
60
AssetManager
Resolvers
Filters
Cache
Assets
Dove mettiamo gli asset?
61
tutti gli assetdel modulo
module.config.php
return array(
'asset_manager' => array(
'resolver_configs' => array(
'paths' => array(
__DIR__ . '/../assets',
),
),),), ...
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');
module.config.php
Ora il modulo è davvero riusabile!
66
3) ENTITA’ CONDIVISE
Catalogo
68
Carrello
69
Prodotto
(con la sua entità del modello, i mappers, i
servizi, ecc.)
Catalogo Carrellomoduli
70
Prodotto- id- nome- prezzo
Catalogo Carrellomoduli
71
Catalogo Carrello
? ?Prodotto
- id- nome- prezzo
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
76
Carrello
Prodotto- id- nome- prezzo
Catalogo
77
Carrello
- dimensioneSchermo- RAM- prezzoOfferta- …
Prodotto- id- nome- prezzo
Prodotto- id- nome- prezzo
Catalogo
78
Carrello
- dimensioneSchermo- RAM- prezzoOfferta- …
Prodotto- id- nome- prezzo
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(…)
)
);
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);
}
}
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(…)
)
);
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(…)
)
);
E i «vincoli» (es. nome + prezzo)?
/**
* 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)?
Catalogo
85
Carrello
dimensioneSchermo, RAM, prezzoOfferta,
…
Prodottoid, nome, prezzo
Servizi, mapper, comportamenti, …
86
Ora il modulo è davvero riusabile!
PROBLEMA 4: PANNELLO ADMIN
Ho bisogno di un’altra cartella
/public?
88
Ho bisogno di un’altra cartella
/public?
89
Probabilmente no(a meno di casi particolari)
Creo un modulo per tutta la parte amministrativa?
90
Creo un modulo per tutta la parte amministrativa?
91
Potrei… ma non sarebbe riusabile
(né lui né gli altri moduli)
Inglobo la parte amministrativa dentro ciascun modulo?
92
Inglobo la parte amministrativa dentro ciascun modulo?
93
Esatto!O almeno nella maggioranza dei casi
Da dove eravamo partiti…
94
Sito Web
Modello
Amministrazione sito Web
Contenuti e pagine statiche
Catalogo servizi
Form contatti
Ciò che voglio:http://mio.si.to/adminhttp://mio.si.to/admin/cataloghttp://mio.si.to/admin/userhttp://mio.si.to/admin/purchase…
95
Come?
96
Un modulo di
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' => 'Catalog\Controller\Admin',
'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' => 'Catalog\Controller\Admin',
'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' => 'Catalog\Controller\Admin',
'action' => 'index',
),
),),),),
),
);
/admin/catalog
Il pannello admin del modulo è pronto!
102
103
e l’autenticazione?
Il pannello admin del modulo è pronto!
Autenticazione
104
+
Gestione autorizzazioni/* Modulo AppCatalog – module.config.php */
return array(
…
'bjyauthorize' => array(
'guards' => array(
'BjyAuthorize\Guard\Route' => array(
array('route' => 'zfcadmin/catalog',
'roles' => array('user')),
),
),
),
);
Tiriamo le somme
106
+ RIUSO
APPLICAZIONI CUSTOM
Stefano [email protected]@mvassociati.it
Grazie per l’attenzione
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