Mais conteúdo relacionado
Semelhante a Zend Framework 2 (20)
Mais de Enrico Zimuel (16)
Zend Framework 2
- 1. Sviluppo di applicazioni PHP con
Zend Framework
Le novità della versione 2.0 e stato dell'arte del progetto
Enrico Zimuel (enrico@zend.com)
Senior PHP Engineer, Zend Technologies
Zend Framework Core Team
PUG Torino, 26 Gennaio 2012
© All rights reserved. Zend Technologies, Inc.
- 2. Sommario
●
Perchè utilizzare un framework di sviluppo?
●
Introduzione a Zend Framework
●
Caratteristiche del progetto
● La versione 1.x
● La nuova release 2.0
●
L'architettura di ZF2
● Futuro di ZF2
© All rights reserved. Zend Technologies, Inc.
- 4. Framework
●
Un framework di sviluppo è un insieme di librerie o
classi riutilizzabili, studiate per facilitare
l'implementazione di un progetto software.
●
Caratteristiche di un framework:
▶ Riusabilità
▶ Standardizzazione
▶ Estensibilità
▶ Qualità del codice
▶ Sicurezza
© All rights reserved. Zend Technologies, Inc.
- 5. Vantaggi nell'utilizzo di un framework
●
Velocità di sviluppo
▶ Riduzione del time to market
●
Standard nella scrittura del codice
▶ Facilita il lavoro in team
●
Qualità del codice
▶ Utilizzo di codice testato
●
Sicurezza
▶ Migliorare la sicurezza
© All rights reserved. Zend Technologies, Inc.
- 6. Come scegliere un framework
● Diffusione del framework
●
Documentazione
●
Supporto
● Licenza d'utilizzo
●
Curva di apprendimento
© All rights reserved. Zend Technologies, Inc.
- 7. Esempi di framework software
● Java ● Perl
▶ Spring ▶ Catalyst
▶ Struts ▶ Mojolicious
▶ Jboss ●
Ruby
● ASP/C#/VB ▶ Ruby on Rails
▶ .NET ▶ Padrino
●
PHP ▶ Sinatra
▶ Cake PHP ● Python
▶ CodeIgniter
▶ Django
▶ Symfony
▶ Pylons
▶ Zend Framework
© All rights reserved. Zend Technologies, Inc.
- 9. Zend Framework
●
Framework PHP per lo sviluppo di applicazioni web
▶ > 10 milioni di download
▶ > 500 sviluppatori
▶ > 10 milioni hits su Google
●
Open source, licenza basata su new BSD
●
Sito del progetto: http://framework.zend.com
●
© Zend Technologies Ltd.
© All rights reserved. Zend Technologies, Inc.
- 10. Zend Technologies
● Zend Technologies Ltd, the PHP Company
● Fondata nel 1999 da Andi Gutmans e Zeev Suraski, gli
sviluppatori del PHP 3.0
● Quartier generale nella Silicon Valley a Cupertino (USA)
●
Uffici in: Francia, Germania, India, Irlanda, Israele, Italia
●
© PHP Engine 2 (l'interprete del PHP)
●
Sito: http://www.zend.com
© All rights reserved. Zend Technologies, Inc.
- 12. Breve storia di ZF
● Ottobre 2005: Annuncio del progetto
● Marzo 2006: Prima versione (pulic review), 0.1.0
● Luglio 2007: Prima versione stabile 1.0
● Marzo 2008: Prima minor release 1.5.0
▶ Zend_Form, Zend_Layout
● Aprile 2009: 1.8.0
▶ Zend_Tool, Zend_Application
● Agosto 2009: 1.9.0
▶ Supporto PHP 5.3
© All rights reserved. Zend Technologies, Inc.
- 13. Breve storia di ZF (2)
● Agosto 2010: Zend Framework 2.0.0dev1
● Novembre 2010: 1.11.0
▶ Supporto dispositivi mobile tramite
Zend_Http_UserAgent
▶ Simple Cloud API tramite Zend_Cloud
● Novembre 2010: Zend Framework 2.0.0dev2
● Giugno 2011: Zend Framework 2.0.0dev3
● Settembre 2011: 1.11.11
● Ottobre 2011: Zend Framework 2.0.0beta1
●
Dicembre 2011: Zend Framework 2.0.0beta2
© All rights reserved. Zend Technologies, Inc.
- 14. Caratteristiche di ZF
●
Architettura aperta
▶ Facile integrazione in progetti di terze parti
▶ Design del tipo “Use at will”
● Completamente ad oggetti in PHP 5
● Codice testato, Unit test (PHPUnit)
●
Utilizzo di design pattern
▶ MVC, Factory, Singleton, etc
● Qualche numero per ZF1:
▶ ≈ 4000 classi, ≈ 9000 files, ≈ 91 Mb
▶ ≈ 460'000 linee di codice
▶ Reference guide > 1000 pagine
© All rights reserved. Zend Technologies, Inc.
- 17. Ciclo di sviluppo in ZF
●
Proposta di un nuovo componente
dalla community
●
Ready for review (community)
● Ready for recommendation
●
Pending recommendation
(revisione da parte del Core
Team)
● Ok per il Laboratory
●
Testing e review
● Ok per il rilascio in release
(standard/extras)
© All rights reserved. Zend Technologies, Inc.
- 19. Zend Framework 2.0
● Novità principali:
▶ Nuova architettura (basata su eventi)
▶ Utilizzo di PHP 5.3
▶ Niente più CLA (Contributor License Agreement)
▶ Git (GitHub) al posto di SVN
▶ Performance migliorate
▶ Gestione nativa dei moduli
▶ Sistema packaging
© All rights reserved. Zend Technologies, Inc.
- 20. Nuovo approccio
●
In ZF1:
▶ Singletons, Registries, e dipendenze tra classi
scritte nel codice (hard-coded)
● In ZF2:
▶ Programmazione orientata agli aspetti (Aspect
Oriented Design) e Dependency Injection
© All rights reserved. Zend Technologies, Inc.
- 21. Nuova architettura
●
Metodologie utilizzate nello sviluppo
▶ Decoupling (ZendDi)
▶ Orientata agli eventi (ZendEventManager)
▶ Interfacce standard (ZendStdlib)
● Utilizzo delle nuove funzionalità di PHP 5.3
▶ Namespace
▶ Funzioni anonime
▶ Late Static Bindings (static::)
© All rights reserved. Zend Technologies, Inc.
- 23. Autoloading
●
Niente più require_once!
● Più soluzioni di autoloading:
▶ In stile ZF1 include_path
▶ Basato su namespace/prefissi
▶ Class-map
© All rights reserved. Zend Technologies, Inc.
- 24. In stile ZF1
require_once 'Zend/Loader/StandardAutoloader.php';
$loader = new ZendLoaderStandardAutoloader(array(
'fallback_autoloader' => true,
));
$loader->register();
© All rights reserved. Zend Technologies, Inc.
- 26. Class-map
return array(
'MyFooBar' => __DIR__ . '/Foo/Bar.php',
);
.classmap.php
require_once 'Zend/Loader/ClassMapAutoloader.php';
$loader = new ZendLoaderClassMapAutoloader();
$loader->registerAutoloadMap(
__DIR__ . '/../library/.classmap.php');
$loader->register();
© All rights reserved. Zend Technologies, Inc.
- 27. Generazione automatica di class-map
●
Script per la generazione automatica di class-map:
bin/classmap_generator.php
● Semplice utilizzo:
$ cd your/library
$ php /path/to/classmap_generator.php -w
● Genera la class-Map del progetto nel file
.classmap.php
© All rights reserved. Zend Technologies, Inc.
- 28. Performance
● Class-Maps offre un miglioramento del 25%
rispetto all'autoloading di ZF1, senza l'utilizzo di
un acceleratore bytecode (ad esempio APC)
▶ e un miglioramento del 60-85% con un acceleratore
di codice
●
Namespace/prefisso offre un miglioramento del
10% senza un acceleratore bytecode
▶ e un miglioramento del 40% con un acceleratore di
bytecode
© All rights reserved. Zend Technologies, Inc.
- 29. Esempio: strategie multiple di autoloading
sviluppo test produzione
Script di
generazione
developer class_map
Autoloading Autoloading Autoloading
in stile ZF1 Namespace/Prefisso Class-map
oppure Class-map
© All rights reserved. Zend Technologies, Inc.
- 31. Dependency injection
●
Come gestire la dipendenza tra oggetti?
●
La Dependency injection (Di) è un design pattern per
la gestione delle dipendenze tra oggetti
© All rights reserved. Zend Technologies, Inc.
- 32. Esempio in PHP
Senza Di Con Di (in costruzione)
class Foo { class Foo {
protected $bar; protected $bar;
… …
public function __construct() { public function
$this->bar= new Bar(); __construct(Bar $bar) {
} $this->bar = $bar;
… }
} …
}
Contro: Pro:
Difficoltà di testing Facilità di test (mock)
Accoppiamento Coesione
Difficoltà nel riutilizzo Semplice riutilizzo
© All rights reserved. Zend Technologies, Inc.
- 33. Di tramite set
class Foo {
protected $bar;
…
public function setBar(Bar $bar) {
$this->bar = $bar;
}
…
}
© All rights reserved. Zend Technologies, Inc.
- 34. ZendDi
● Supporta differenti pattern:
– In costruzione (constructor)
– Interfaccia
– Tramite set
●
Implementa un Di Container:
– Gestisce le dipendenze utilizzando una
definizione (configurazione) o tramite
annotazioni
– Fornisce un compilatore per l'autodiscover
delle classi e delle loro dipendenze
© All rights reserved. Zend Technologies, Inc.
- 35. Esempio di definizione
$definition = array(
'Foo' => array(
'setBar' => array(
'bar' => array(
'type' => 'Bar',
'required' => true,
),
),
),
);
© All rights reserved. Zend Technologies, Inc.
- 36. Utilizzo di un Di container
use ZendDiDi,
ZendDiConfiguration;
$di = new Di;
$config = new Configuration(array(
'definition' => array('class' => $definition)
));
$config->configure($di);
$foo = $di->get('Foo'); // contiene Bar
© All rights reserved. Zend Technologies, Inc.
- 37. Di tramite annotazione
namespace FooBar {
use ZendDiDefinitionAnnotation as Di;
class Baz {
public $bam;
/**
* @DiInject()
*/
public function setBam(Bam $bam){
$this->bam = $bam;
}
}
class Bam {
}
}
© All rights reserved. Zend Technologies, Inc.
- 38. Di tramite annotazione (2)
$compiler = new ZendDiDefinitionCompilerDefinition();
$compiler->addDirectory('percorso di Bar e Baz');
$compiler->compile();
$definitions = new ZendDiDefinitionList($compiler);
$di = new ZendDiDi($definitions);
$baz = $di->get('FooBarBaz');
Per conoscere più casi d'uso di ZendDi:
https://github.com/ralphschindler/zf2-di-use-cases
© All rights reserved. Zend Technologies, Inc.
- 40. Come estendere un framework?
●
Come introdurre un sistema di log in un framework?
●
Come aggiungere un sistema di cache, senza
modificare/estendere il codice del framework?
●
Come introdurre un sistema di validazione, filtro,
ACL, etc, senza modificare/estendere il framework?
© All rights reserved. Zend Technologies, Inc.
- 41. Event Manager
●
Event Manager è un oggetto per l'ascolto (listener)
di uno o più eventi
●
Un listener è un riferimento (callback) ad una
funzione che viene eseguita a seguito del verificarsi
di un evento
●
Un evento è un'azione che viene eseguita
© All rights reserved. Zend Technologies, Inc.
- 42. Esempio
use ZendEventManagerEventManager;
$events = new EventManager();
$events->attach('do', function($e) {
$event = $e->getName();
$params = $e->getParams();
printf(
'Handled event “%s”, with parameters %s',
$event,
json_encode($params)
);
});
$params = array('foo' => 'bar', 'baz' => 'bat');
$events->trigger('do', null, $params);
© All rights reserved. Zend Technologies, Inc.
- 44. Architettura orientata agli eventi
●
Una tipica applicazione ZF2 è composta da un
sistema di routing, da uno o più moduli e da un
gestore degli eventi (event manager)
●
Una rotta restituisce il nome di un controller e di
un'azione, per ogni modulo
●
I controller sono prelevati da un container (Di)
ed eseguiti
●
Il routing ed il dispatching sono degli eventi
© All rights reserved. Zend Technologies, Inc.
- 45. Terminologia in ZF2
●
Applicazione: è un insieme di codice che risolve uno
specifico problema di business. Idealmente, le
applicazioni consumano librerie e componenti.
●
Modulo: è una collezione di codice, o di altri file, che
implementano una funzionalità specifica (atomica) di
un progetto
●
Libreria: è una raccolta di codice che risolve un
problema generico
●
Componente: è una raccolta di codice che risolve un
problema più specifico all'interno di una libreria.
© All rights reserved. Zend Technologies, Inc.
- 46. Moduli
●
Il componente base di un'applicazione MVC
con ZF2 è il modulo
●
La struttura di un modulo è semplice:
▶ Un namespace
▶ Un'unica classe, denominata Module.php
© All rights reserved. Zend Technologies, Inc.
- 47. Esempio
●
modules/
● Foo/
● Module.php
© All rights reserved. Zend Technologies, Inc.
- 48. Module.php
namespace Foo;
class Module { }
● Di solito all'interno dei moduli sono presenti:
▶ Autoloading
▶ Configurazioni di base
© All rights reserved. Zend Technologies, Inc.
- 49. index.php
use ZendModuleManager,
ZendMvcBootstrap,
ZendMvcApplication;
$config = include __DIR__. '/../configs/app.config.php';
$modules = new Manager($config['modules']);
$bootstrap = new Bootstrap($modules);
$app = new Application();
$bootstrap->bootstrap($app);
$app->run()->send();
© All rights reserved. Zend Technologies, Inc.
- 51. Render di una vista
use ZendEventManagerEventCollection as Events,
ZendEventManagerListenerAggregate;
class ViewListener implements ListenerAggregate
{
/* ... */
public function attach(Events $events)
{
$events->attach('dispatch',
array($this, 'renderView', -100);
$events->attach('dispatch',
array($this, 'renderLayout', -1000);
}
/* ... */
}
© All rights reserved. Zend Technologies, Inc.
- 52. Gestione delle dipendenze
namespace ContactController;
use ZendMailTransport,
ZendMvcControllerActionController;
class ContactController extends ActionController
{
public function setMailer(Transport $transport)
{
$this->transport = $transport;
}
}
© All rights reserved. Zend Technologies, Inc.
- 53. Configurazione
return array('di' => array(
'definition' => array('class' => array(
'ZendMailTransportSmtp' => array(
'__construct' => array(
'host' => array('required' => true, 'type' => false),
'user' => array('required' => true, 'type' => false),
'pass' => array('required' => true, 'type' => false),
),
),
)),
'instance' => array(
'ZendMailTransport' => array('parameters' => array(
'host' => 'some.host.tld',
'user' => 'user',
'pass' => 'pass'
)),
),
);
© All rights reserved. Zend Technologies, Inc.
- 55. Package in ZF2
●
http://packages.zendframework.com/
● Codici sorgenti (download + github)
●
Pyrus package:
▶ wget http://packages.zendframework.com/pyrus.phar
▶ pyrus.phar .
▶ pyrus.phar . channeldiscover
packages.zendframework.com
▶ pyrus.phar . install zf2/<zfpackage>
▶ pyrus.phar . install zf2/Zend_<component>
© All rights reserved. Zend Technologies, Inc.
- 57. Prossime release di ZF2
●
Versione 2.0.0beta3
▶ Prevista per fine Febbraio 2012
●
Versione 2.0.0beta4
▶ Prevista dopo 6 settimane dalla beta3
●
ZF 1.12 (prevista per Marzo 2012)
▶ EventManager di ZF2
▶ Autoloader di ZF2
▶ Nuovi componenti Cloud (Rackspace)
▶ ...
© All rights reserved. Zend Technologies, Inc.
- 58. Riferimenti
●
Sito ufficiale
▶ http://framework.zend.com
●
ZF2 wiki:
▶ http://bit.ly/zf2wiki
●
zf-contributors mailing list:
▶ zf-contributors-subscribe@lists.zend.com
●
IRC:
▶ #zftalk.dev, #zftalk, #zftalk.2 su Freenode
▶ Meeting bi-settimanale su #zf2-meeting (ogni
mercoledì alle 19:00, ora italiana)
© All rights reserved. Zend Technologies, Inc.
- 59. Risorse
●
SVN ZF1:
▶ http://framework.zend.com/svn/framework/
● Git guide ZF2:
▶ http://bit.ly/zf2gitguide
● GitHub ZF2:
▶ http://github.com/zendframework/zf2
●
Moduli ZF2:
▶ http://modules.zendframework.com/
● Applicazione d'esempio ZF2:
▶ https://github.com/EvanDotPro/ZendSkeletonApplication
© All rights reserved. Zend Technologies, Inc.
- 60. Domande?
© All rights reserved. Zend Technologies, Inc.