Introduzione a Zend Framework 2 per chi proviene da Zend Framework 1, tenuta allo Zend Framework Day di Milano del 01/02/2013. Introduzione alle nuove caratteristiche e pattern architetturali di ZF2
Zend Framework 2 non è l'evoluzione di ZF, ma un progetto nuovo: il codice è stato riscritto e poche sono le parti in comune con la versione precedente. Lo sviluppatore abituato a ZF1 non ha vita facile, ed è fondato il timore di dover imparare tutto da capo. In questo talk vediamo come cambiare le vecchie abitudini di sviluppatori ZF1, per sfruttare al meglio le potenzialità del nuovo strumento. Attraverso esempi concreti, in cui vedremo all'opera i nuovi pattern e le best practice, mostriamo come - partendo con il piede giusto - il passaggio a ZF2 possa essere meno traumatico del previsto. Il talk è orientato soprattutto a chi già conosce ZF1, ma gli argomenti affrontati possono essere utili anche a chi si avvicina a ZF per la prima volta.
Levate l'ancora! Rotte senza problemi con ZF2Diego Drigani
Introduzione al routing di Zend Framework 2, tenuta allo Zend Framework Day del 01/02/2013 a Milano.
Avere URL pulite e ben strutturate è molto importante, sia da un punto di vista SEO, che di organizzazione delle proprie API. In Zend Framework 2 è il router ad occuparsi di gestire le richieste http, di delegare l'esecuzione delle stesse all'opportuno frammento di codice sorgente, e quindi di estrarne gli eventuali parametri. Questo talk introduce le potenti funzionalità del nuovo sistema di routing di ZF2. Grazie a esempi reali (con gestione di richiestte http, ma anche CLI), sarete in grado di utilizzare il nuovo router di ZF2 in tutta la sua flessibilità.
Levate l'ancora! Rotte senza problemi con ZF2Diego Drigani
Introduzione al routing di Zend Framework 2, tenuta allo Zend Framework Day del 01/02/2013 a Milano.
Avere URL pulite e ben strutturate è molto importante, sia da un punto di vista SEO, che di organizzazione delle proprie API. In Zend Framework 2 è il router ad occuparsi di gestire le richieste http, di delegare l'esecuzione delle stesse all'opportuno frammento di codice sorgente, e quindi di estrarne gli eventuali parametri. Questo talk introduce le potenti funzionalità del nuovo sistema di routing di ZF2. Grazie a esempi reali (con gestione di richiestte http, ma anche CLI), sarete in grado di utilizzare il nuovo router di ZF2 in tutta la sua flessibilità.
Come portare il profiler di symfony2 in drupal8Luca Lusso
Molti progetti PHP open source hanno adottato Symfony2 come base per la loro prossima versione, tra questi c'è anche il CMS Drupal (http://drupal.org). In questo talk vedremo come scrivere un modulo per Drupal8 in modo da sfruttare il più possibile il suo nuovo motore Symfony2, dall'integrazione con il service container alla gestione degli eventi, dal routing a Twig. Verrà usato come esempio il modulo webprofiler (http://drupal.org/project/webprofiler) per dimostrare come un bundle per Symfony2 possa essere trasformato in un modulo per Drupal8 e integrato facilmente nel sistema.
Hai mai pensato a cosa succede quando una richiesta HTTP arriva al tuo sito Drupal? Come Drupal trova il codice corretto da eseguire? Quali parti di una pagina provengono dalla cache e quali sono costruite da zero? Quante e quali query vengono eseguite sul database? E, perché no, quanto tempo e quanto memoria richiede convertire la richiesta in una risposta?
Che tu sia una persona che sviluppa moduli o solo curiosa, le risposte a queste domande ti aiuteranno a comprendere meglio come funziona internamente il tuo CMS preferito (perché se non lo è già, lo diventerà).
Per fare questo useremo il modulo Webprofiler, che ci aiuterà a capire come le varie componenti di Drupal interagiscono per convertire una richiesta in una risposta. Webprofiler raccoglie dati durante la costruzione di ogni pagina del sito e ci permette di esplorare facilmente cosa succede all’interno di Drupal.
Seguiremo il percorso di una richiesta iniziando dai middleware, passeremo dal routing al controller per finire a Twig. Scopriremo come i servizi forniscono funzionalità e come gli eventi danno la possibilità (o l’opportunità) di scrivere codice disaccoppiato. Il tutto senza perdere di vista le performance e tenendo un occhio sulle risorse, il tempo, le cache e le query.
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantTassi Francesco
Sogni di sviluppare il tuo SaaS, di poterlo gestire, curare, evolvere. Speri di attrarre nuovi utenti con funzionalità innovative, di offrire un servizio veloce e puntuale. Finalmente ti puoi concentrare sulla qualità del tuo prodotto. Poi una mattina ti svegli, hai un database da 50GB, modificare una colonna richiede 8 ore e ti ritrovi in trappola. Gioie e dolori delle applicazioni multi-tenant. In questo talk analizzeremo perché e come abbiamo suddiviso il database di un SaaS da circa 1 milione di utenti.
> Vedremo come aggiungere un parametro di selezione del db a tutti i comandi della console, come eseguire comandi in parallelo per ridurre i tempi di manutenzione, come aggiungere info di debug utilizzando gli eventi del framework, come gestire il caricamento delle fixtures, quali idee si sono rivelate vincenti e quali no.
by Davide Cerbo e Stefano Linguerri
La programmazione web sta facendo passi da gigante e oggi l’utente si aspetta che l’esperienza di utilizzo si avvicini sempre di più a quella a cui è abituato nei classici applicativi desktop. Il mondo degli sviluppatori ha risposto inventanto una nuova sigla: RIA, cioè Rich Internet Application. Google non è stata a guardare e ha fornito la sua risposta a questa esigenza donando alla community Google Web Toolkit. Questo nuovo framework permette di sviluppare in Java tutta l’interfaccia utente per poi ottenere un codice javascript che funzionerà su qualsiasi browser web senza l’installazione di plugin aggiuntivi. In questa presentazione vedremo:
* perchè sviluppare applicazioni RIA
* perchè usare GWT
* come GWT utilizza AJAX per comunicare con il server
* le ottimizzazione che avremo utilizzando GWT
* come uscire dal browser con Google Gear e Mozilla Prism
* e non solo…
Non Conventional Android Programming (Italiano)Davide Cerbo
Android è il nuovo sistema operativo open source per dispositivi mobili e realizzato da Google che si è posta la missione di rendere l’internet mobile accessibile a tutti tramite dispositi a basso costo.
Durante questo intervento mostrerò come sia possibile sviluppare per questo sistema operativo (e non solo) senza l’utilizzo di Java e come sia possibile utilizzare una versione light di Spring Framework nelle applicazioni mobili.
Simple Cloud API: accesso semplificato al cloud computingFrancesca1980
In questa sessione verrà presentato il progetto open source Simple Cloud API per l'accesso semplificato ai servizi di cloud computing. Il progetto, nato dalla volontà di Zend Technologies, IBM e Microsoft, offre un API semplificata per l'accesso a differenti servizi di cloud computing. I servizi attualmente implementati sono di File Storage, Document Storage e Simple Queue sui sistemi cloud di Amazon, Windows Azure e Nirvanix (in futuro anche Rackspace e GoGrid). Nella presentazione, dopo una breve introduzione ai servizi di cloud computing ed alla loro rilevanza dal punto di vista dello sviluppo delle applicazioni web, verranno presentati degli esempi in PHP per l'utilizzo del Simple Cloud API
Il testing delle applicazioni MVC Zend Framework è spesso visto come una sorta di stregoneria, ma tutto sommato non lo è. In questo seminario web vedremo cosa e come testare, i pattern più comuni per il testing e le possibili difficoltà che si possono incontrare. Verranno trattati inoltre alcuni elementi di base su PHPUnit in modo da fornire concetti fondamentali per l’operatività anche a chi non è esperto di testing.
"(My) Best Pratices in Symfony" è una parte delle slides utilizzate durante un Train to Symfony2 organizzato in una web agency nel Giugno 2014.
Non è un elenco di best practices in senso stretto, sono semplicemente spunti dai quali partire per affrontare alcune problematiche pratiche.
Scopri su http://traintosymfony.com cos'è Train to Symfony, e quanto possa essere utile alla tua azienda.
Slides of my talk at the Feb 20th 2020 PMI NIC Event on Requirement Management at Wartsila in Trieste, Italy. I'm highlighting what worked well and what did not during my career, also taking into account recent paradigms such as Cloud and DevOps. I'm also dissecting some of main agile principles and sharing my opinion on how to benefit from them.
More Related Content
Similar to Fare con Zend Framework 2 ciò che facevo con ZF1
Come portare il profiler di symfony2 in drupal8Luca Lusso
Molti progetti PHP open source hanno adottato Symfony2 come base per la loro prossima versione, tra questi c'è anche il CMS Drupal (http://drupal.org). In questo talk vedremo come scrivere un modulo per Drupal8 in modo da sfruttare il più possibile il suo nuovo motore Symfony2, dall'integrazione con il service container alla gestione degli eventi, dal routing a Twig. Verrà usato come esempio il modulo webprofiler (http://drupal.org/project/webprofiler) per dimostrare come un bundle per Symfony2 possa essere trasformato in un modulo per Drupal8 e integrato facilmente nel sistema.
Hai mai pensato a cosa succede quando una richiesta HTTP arriva al tuo sito Drupal? Come Drupal trova il codice corretto da eseguire? Quali parti di una pagina provengono dalla cache e quali sono costruite da zero? Quante e quali query vengono eseguite sul database? E, perché no, quanto tempo e quanto memoria richiede convertire la richiesta in una risposta?
Che tu sia una persona che sviluppa moduli o solo curiosa, le risposte a queste domande ti aiuteranno a comprendere meglio come funziona internamente il tuo CMS preferito (perché se non lo è già, lo diventerà).
Per fare questo useremo il modulo Webprofiler, che ci aiuterà a capire come le varie componenti di Drupal interagiscono per convertire una richiesta in una risposta. Webprofiler raccoglie dati durante la costruzione di ogni pagina del sito e ci permette di esplorare facilmente cosa succede all’interno di Drupal.
Seguiremo il percorso di una richiesta iniziando dai middleware, passeremo dal routing al controller per finire a Twig. Scopriremo come i servizi forniscono funzionalità e come gli eventi danno la possibilità (o l’opportunità) di scrivere codice disaccoppiato. Il tutto senza perdere di vista le performance e tenendo un occhio sulle risorse, il tempo, le cache e le query.
SaaS con Symfony2 un caso *molto* concreto di applicazione multitenantTassi Francesco
Sogni di sviluppare il tuo SaaS, di poterlo gestire, curare, evolvere. Speri di attrarre nuovi utenti con funzionalità innovative, di offrire un servizio veloce e puntuale. Finalmente ti puoi concentrare sulla qualità del tuo prodotto. Poi una mattina ti svegli, hai un database da 50GB, modificare una colonna richiede 8 ore e ti ritrovi in trappola. Gioie e dolori delle applicazioni multi-tenant. In questo talk analizzeremo perché e come abbiamo suddiviso il database di un SaaS da circa 1 milione di utenti.
> Vedremo come aggiungere un parametro di selezione del db a tutti i comandi della console, come eseguire comandi in parallelo per ridurre i tempi di manutenzione, come aggiungere info di debug utilizzando gli eventi del framework, come gestire il caricamento delle fixtures, quali idee si sono rivelate vincenti e quali no.
by Davide Cerbo e Stefano Linguerri
La programmazione web sta facendo passi da gigante e oggi l’utente si aspetta che l’esperienza di utilizzo si avvicini sempre di più a quella a cui è abituato nei classici applicativi desktop. Il mondo degli sviluppatori ha risposto inventanto una nuova sigla: RIA, cioè Rich Internet Application. Google non è stata a guardare e ha fornito la sua risposta a questa esigenza donando alla community Google Web Toolkit. Questo nuovo framework permette di sviluppare in Java tutta l’interfaccia utente per poi ottenere un codice javascript che funzionerà su qualsiasi browser web senza l’installazione di plugin aggiuntivi. In questa presentazione vedremo:
* perchè sviluppare applicazioni RIA
* perchè usare GWT
* come GWT utilizza AJAX per comunicare con il server
* le ottimizzazione che avremo utilizzando GWT
* come uscire dal browser con Google Gear e Mozilla Prism
* e non solo…
Non Conventional Android Programming (Italiano)Davide Cerbo
Android è il nuovo sistema operativo open source per dispositivi mobili e realizzato da Google che si è posta la missione di rendere l’internet mobile accessibile a tutti tramite dispositi a basso costo.
Durante questo intervento mostrerò come sia possibile sviluppare per questo sistema operativo (e non solo) senza l’utilizzo di Java e come sia possibile utilizzare una versione light di Spring Framework nelle applicazioni mobili.
Simple Cloud API: accesso semplificato al cloud computingFrancesca1980
In questa sessione verrà presentato il progetto open source Simple Cloud API per l'accesso semplificato ai servizi di cloud computing. Il progetto, nato dalla volontà di Zend Technologies, IBM e Microsoft, offre un API semplificata per l'accesso a differenti servizi di cloud computing. I servizi attualmente implementati sono di File Storage, Document Storage e Simple Queue sui sistemi cloud di Amazon, Windows Azure e Nirvanix (in futuro anche Rackspace e GoGrid). Nella presentazione, dopo una breve introduzione ai servizi di cloud computing ed alla loro rilevanza dal punto di vista dello sviluppo delle applicazioni web, verranno presentati degli esempi in PHP per l'utilizzo del Simple Cloud API
Il testing delle applicazioni MVC Zend Framework è spesso visto come una sorta di stregoneria, ma tutto sommato non lo è. In questo seminario web vedremo cosa e come testare, i pattern più comuni per il testing e le possibili difficoltà che si possono incontrare. Verranno trattati inoltre alcuni elementi di base su PHPUnit in modo da fornire concetti fondamentali per l’operatività anche a chi non è esperto di testing.
"(My) Best Pratices in Symfony" è una parte delle slides utilizzate durante un Train to Symfony2 organizzato in una web agency nel Giugno 2014.
Non è un elenco di best practices in senso stretto, sono semplicemente spunti dai quali partire per affrontare alcune problematiche pratiche.
Scopri su http://traintosymfony.com cos'è Train to Symfony, e quanto possa essere utile alla tua azienda.
Similar to Fare con Zend Framework 2 ciò che facevo con ZF1 (20)
Slides of my talk at the Feb 20th 2020 PMI NIC Event on Requirement Management at Wartsila in Trieste, Italy. I'm highlighting what worked well and what did not during my career, also taking into account recent paradigms such as Cloud and DevOps. I'm also dissecting some of main agile principles and sharing my opinion on how to benefit from them.
The Metaphor Fallacy (in Digital Product Development)Steve Maraspin
Sharing personal thoughts on how metaphors can hinder, rather than help software modeling and design (at different levels). Talk presented at the 2014 Better Software Conference.
La filosofia Lean nello sviluppo di prodotti digitaliSteve Maraspin
Slide del mio intervento presso l'ordine degli Ingegneri di Udine il 12/06/2014. Contemplati diversi ambiti in cui i principi Lean aiutano a migliorare i processi di sviluppo.
Error Reporting in ZF2: form messages, custom error pages, loggingSteve Maraspin
Errors frustrate users. No matter if it's their fault or applications', risks that they'll lose interest in our product is high. In this presentation, given at the Italian ZFDay 2014, I discuss about these issues and provide some hints for improving error reporting and handling.
Outcome not Output: A Story of Lean UX AdoptionSteve Maraspin
This presentation shares our experience with Lean UX adoption and offers some hints on how to combine User Centered Design activities within an Agile development workflow.
How do we take decisions? Are we fully conscious of what we do when using a system interface? There's a lot of unconscious activity going on while we use a digital product. This talk describes a few important factors interface designers should keep in mind while designing interaction.
ZF2 Modular Architecture - Taking advantage of itSteve Maraspin
Zend Framework 1 had modules. Their name is pretty much everything Zend Framework 2 modules share with them, though. The whole framework architecture has been rewritten to encourage software reuse and extension. In this talk I’ll share our experiences on ZF2 module creation and usage.
NoSQL Data Stores: Introduzione alle Basi di Dati Non RelazionaliSteve Maraspin
Seconda parte del seminario su NoSQL al DiTeDi di Udine del 15/12/2012. Presentata un'introduzione sulle basi di dati non relazionali e sulle implicazioni che le loro caratteristiche hanno nello sviluppo di applicazioni enterprise.
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBSteve Maraspin
Pirma parte del seminario su NoSQL al DiTeDi di Udine del 15/12/2012. Affrontato il caso di studio di un'architettura enterprise, basata su datastore relazionali (PostgreSQL) e non (CouchDB, MongoDB, Redis e OrientDB).
NoSQL, No Worries: Vecchi Problemi, Nuove SoluzioniSteve Maraspin
Slide del talk sulle basi di dati non relazionali (NoSQL) al Codemotion di Venezia del 17/11/2012. Presentato un caso di studio di architettura basata su CouchDB, MongoDB, Redis e OrientDB, oltre che diversi concetti relativi ai datastore NoSQL.
Permettere al cliente di apprezzare l'approccio agileSteve Maraspin
Presentazione del 27/09/2012 a Better Software - Firenze, Italia. Raccontata la nostra esperienza e l'approccio utilizzato per garantire la soddisfazione del cliente nel lungo termine
49. index.php
<?php
/**
* This makes our life easier when dealing with paths. Everything is
* relative to the application root now.
*/
chdir(dirname(__DIR__));
// Setup autoloading
require 'init_autoloader.php';
// Run the application!
ZendMvcApplication::init(require 'config/application.config.php')->run();
55. Module.php
<?php [...]
class Module implements
AutoloaderProviderInterface,
ConfigProviderInterface,
ServiceProviderInterface {
public function getAutoloaderConfig() {[...]}
public function getConfig($env = null) {
return include __DIR__ . '/config/module.config.php';
}
public function getControllerPluginConfig() {[...]}
public function getViewHelperConfig() {[...]}
public function getServiceConfig() {[...]}
}
65. Controller Semplice in ZF2
<?php
namespace ApplicationController;
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
class IndexController extends AbstractActionController
{
public function indexAction()
{
$timestamp = time();
return new ViewModel(array(
'timestamp' => $timestamp
));
}
}
68. Controller ZF1
[…]
class IdraulicoController extends Zend_Controller_Action {
public function installaCaldaia () {
$operatore = new Operatore();
$esito = $operatore->installaCaldaia();
$this->view->esito =$esito;
}
69. Scendiamo nel dettaglio
[…]
class IdraulicoController extends Zend_Controller_Action {
public function installaCaldaia () {
$operatore = new Operatore();
$esito = $operatore->installaCaldaia();
$this->view->esito =$esito;
}
70. Com’è fatto questo oggetto?
[…]
Class Operatore {
public function __constructor () {
$this->caldaia = new Caldaia();
}
public function getCaldaia() {
return $this->caldaia;
}
public function installaCaldaia() {
// Fai qualcosa con $this->caldaia
}
}
71. Dipendenza. Siamo vincolati!
[…]
Class Operatore {
public function __constructor () {
$this->caldaia = new Caldaia();
}
public function getCaldaia() {
return $this->caldaia;
}
public function installaCaldaia() {
// Fai qualcosa con $this->caldaia
}
}
73. Siamo vincolati
[…]
Class Operatore {
public function __constructor (Caldaia $caldaia) {
$this->caldaia = $caldaia;
}
public function getCaldaia() {
return $this->caldaia;
}
public function installaCaldaia() {
// Fai qualcosa con $this->caldaia
}
}
74. Siamo vincolati
[…]
Class Operatore {
public function __constructor (Caldaia $caldaia) {
$this->caldaia = $caldaia;
}
public function getCaldaia() {
return $this->caldaia;
}
public function installaCaldaia() {
// Fai qualcosa con $this->caldaia
}
}
75. Test operatore
[…]
class OperatoreTest extends TestCase {
function testInstallaCaldaia() {
$caldaia = mockCaldaia();
$operatore = new Operatore($caldaia);
$esito = $operatore->installaCaldaia();
$this->assertTrue($esito);
}
}
95. Uso del Service Locator?
[…]
class Termostato implements ServiceLocatorAwareInterface {
[…]
public function getTemperatura() {
$sm = $this->getServiceLocator();
$sensore = $sm->get(‘AziendaModelTermoSensore');
return $sensore->getTemperatura();
}
public function setServiceLocator(ServiceLocatorInterface
$serviceLocator) {
$this->serviceLocator = $serviceLocator; }
public function getServiceLocator() {
return $this->serviceLocator; }
}
96. Abuso del Service Locator
[…]
class Termostato implements ServiceLocatorAwareInterface {
[…]
public function getTemperatura() {
$sm = $this->getServiceLocator();
$sensore = $sm->get(‘AziendaModelTermoSensore');
return $sensore->getTemperatura();
}
public function setServiceLocator(ServiceLocatorInterface
$serviceLocator) {
$this->serviceLocator = $serviceLocator; }
public function getServiceLocator() {
return $this->serviceLocator; }
}
98. Abuso del Service Locator
[…]
class Termostato implements ServiceLocatorAwareInterface {
[…]
public function getTemperatura() {
$sm = $this->getServiceLocator();
$sensore = $sm->get(‘AziendaModelTermoSensore');
return $sensore->getTemperatura();
}
public function setServiceLocator(ServiceLocatorInterface
$serviceLocator) {
$this->serviceLocator = $serviceLocator; }
public function getServiceLocator() {
return $this->serviceLocator; }
}
99. Factory per il Controller
[…]
Class IdraulicoControllerFactory implements
FactoryInterface {
public static function
createService(ServiceLocatorInterface $services) {
$sm = $services->getServiceLocator();
$operatore = $sm->get(‘Operatore');
return new IdraulicoController($operatore);
}
[…]
}
?>
102. Scambio di messaggi
class IdraulicoController {
public function installaCaldaiaAction() {
$operatore = $this->serviceLocator->get(‘operatore’);
$esito = $I_operatore->installaCaldaia();
$I_logger = new Logger();
$I_logger->log(‘Installazione Caldaia’);
return new ViewModel(‘operatore’ => $operatore,
‘esito’ => $esito);
}
}
103. Mi trovo nel posto giusto?
class IdraulicoController {
public function installaCaldaiaAction() {
$operatore = $this->serviceLocator->get(‘operatore’);
$esito = $I_operatore->installaCaldaia();
$I_logger = new Logger();
$I_logger->log(‘Installazione Caldaia’);
return new ViewModel(‘operatore’ => $operatore,
‘esito’ => $esito);
}
}
106. Problema di estendibilità
$s_msg = ‘Installazione Caldaia’;
$I_logger = new Logger();
$I_logger->log($s_msg);
$I_mailer = new Mailer();
$I_mailer->mail($s_msg);
[…]
117. Esempio con controller plugin
<?php
namespace ApplicationController;
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
class IndexController extends AbstractActionController
{
public function redirectAction()
{
$this->redirect()->toUrl(‘http://www.zfday.it’);
}
}
119. Factory per il Controller
[…]
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
class IndexController extends AbstractActionController
{
public function scriviNomeAction()
{
$nome = $this->getEvent()
->getRouteMatch()->getParam('slug');
return (‘nome’ => $nome);
}
}
122. Ma non ho ancora l’EM!
[…]
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
class IndexController extends AbstractActionController
{
public function __construct()
{
$this->azienda = $this->getEvent()
->getRouteMatch()->getParam(‘azienda');
}
}
123. Sulla Dependency Injection…
[…]
// Sul costruttore
public function __construct($dipendenza) {
$this->dipendenza = $dipendenza;
}
// Con setters
Public function __construct() {
}
Public function setDipendenza() {
$this->dipendenza = $dipendenza;
}
124. Agisco sul setter
[…]
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
class IdraulicoController extends AbstractActionController
{
public function setEventManager(EventManagerInterface $events) {
parent::setEventManager($events);
$controller = $this;
$events->attach('dispatch', function ($e) use ($controller) {
$this->name = $controller->params()->fromRoute(‘azienda',
‘Sconosciuta');
}
}}
Vedasi anche il post di M. W. O’Phinney: http://www.mwop.net/blog/2012-07-30-the-new-init.html
127. View
//view index/index.phtml
<div class="row">
<!-- Including header partial -->
<?php echo $this->partial('partials/header.phtml', array()); ?>
<!-- Stampiamo la data -->
<h1>Actual time is: <?php echo $this->timestamp;?></h1>
</div>
128. View con helper
//usando il view helper printData
//view index/index.phtml
<div class="row">
<!-- Including header partial -->
<?php echo $this->partial('partials/header.phtml', array()); ?>
<!-- Stampiamo la data -->
<h1>Actual time is:
<?php echo $this->printData($this->timestamp);?>
</h1>
</div>
129. Helper
//Creando un viewHelper per formattare la data
// Va registrato tra gli invokables del SM dei ViewHelpers
<?php
namespace ApplicationViewHelper;
class PrintData extends ZendViewHelperAbstractHelper {
public function __invoke($timestamp) {
$date = new DateTime();
$date->setTimestamp($timestamp);
$result = $date->format('d-m-Y H:i');
return $result;
}
}
131. Creando una form
//Creiamo il file ContactForm dentro nostro modulo Application/src/Form
<?php
namespace ApplicationForm;
use ZendFormElement;
use ZendFormForm;
class ContactForm extends Form
{
public function __construct()
{
parent::__construct();
// …
}
//...
}
135. Validation: inputFilter
//creiamo l'imput filter contactFilter.php dentro Application/src/Form
<?php
namespace ApplicationForm;
use ZendInputFilterInputFilter;
use ZendValidatorHostname as HostnameValidator;
class ContactFilter extends InputFilter
{
public function __construct()
{
//aggiungiamo i filtri
}
}
137. Controller: Usando la form
namespace ApplicationController;
use ZendMvcControllerAbstractActionController;
use ApplicationFormContact;
use ApplicationFormContactFilter;
class IndexController extends AbstractActionController
{
public function contactAction()
{
$form = new Contact();
$filter = new ContactFilter();
$form->setInputFilter($filter);
return new ViewModel(array(
'form' => $form
);
}
}
145. In sintesi
1. Maggior enfasi sul riuso. Tenere a mente
che ci sono i Moduli
2. Su ZF2 si segue maggiormente un
approccio orientato alla configurazione
piuttosto che convenzione
3. Lo strumento cerca di favorire il
disaccoppiamento (EventManager) e
l’inversione di controllo
(ServiceManager, DI)
145