Zend Framework 2
-
Upload
enrico-zimuel -
Category
Technology
-
view
7.341 -
download
3
description
Transcript of Zend Framework 2
© All rights reserved. Zend Technologies, Inc.
Sviluppo di applicazioni PHP con Zend FrameworkLe novità della versione 2.0 e stato dell'arte del progetto
Enrico Zimuel ([email protected])Senior PHP Engineer, Zend TechnologiesZend Framework Core Team
PUG Torino, 26 Gennaio 2012
© All rights reserved. Zend Technologies, Inc.
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.
Perchè utilizzare un framework?
© All rights reserved. Zend Technologies, Inc.
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.
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.
Come scegliere un framework
● Diffusione del framework● Documentazione ● Supporto● Licenza d'utilizzo● Curva di apprendimento
© All rights reserved. Zend Technologies, Inc.
Esempi di framework software
● Java
▶ Spring
▶ Struts
▶ Jboss
● ASP/C#/VB
▶ .NET
● PHP
▶ Cake PHP
▶ CodeIgniter
▶ Symfony
▶ Zend Framework
● Perl
▶ Catalyst
▶ Mojolicious
● Ruby
▶ Ruby on Rails
▶ Padrino
▶ Sinatra
● Python
▶ Django
▶ Pylons
© All rights reserved. Zend Technologies, Inc.
Zend Framework
© All rights reserved. Zend Technologies, Inc.
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.
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.
Alcuni progetti basati su ZF
© All rights reserved. Zend Technologies, Inc.
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.
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.
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.
Model View Controller in ZF
© All rights reserved. Zend Technologies, Inc.
Componenti del progetto ZF 1
© All rights reserved. Zend Technologies, Inc.
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 CoreTeam)
● Ok per il Laboratory
● Testing e review
● Ok per il rilascio in release (standard/extras)
© All rights reserved. Zend Technologies, Inc.
Zend Framework 2.0
© All rights reserved. Zend Technologies, Inc.
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.
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.
Nuova architettura
● Metodologie utilizzate nello sviluppo
▶ Decoupling (Zend\Di)▶ Orientata agli eventi (Zend\EventManager)▶ Interfacce standard (Zend\Stdlib)
● Utilizzo delle nuove funzionalità di PHP 5.3
▶ Namespace▶ Funzioni anonime▶ Late Static Bindings (static::)
© All rights reserved. Zend Technologies, Inc.
Autoloading
© All rights reserved. Zend Technologies, Inc.
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.
In stile ZF1
require_once 'Zend/Loader/StandardAutoloader.php';
$loader = new Zend\Loader\StandardAutoloader(array( 'fallback_autoloader' => true,));
$loader->register();
© All rights reserved. Zend Technologies, Inc.
Namespace/prefisso
require_once 'Zend/Loader/StandardAutoloader.php';
$loader = new Zend\Loader\StandardAutoloader();
$loader->registerNamespace( 'My', __DIR__ . '/../library/My') ->registerPrefix( 'Foo_', __DIR__ . '/../library/Foo');
$loader->register();
© All rights reserved. Zend Technologies, Inc.
Class-map
return array( 'My\Foo\Bar' => __DIR__ . '/Foo/Bar.php',);
require_once 'Zend/Loader/ClassMapAutoloader.php';
$loader = new Zend\Loader\ClassMapAutoloader();
$loader->registerAutoloadMap( __DIR__ . '/../library/.classmap.php');
$loader->register();
.classmap.php
© All rights reserved. Zend Technologies, Inc.
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.
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.
Esempio: strategie multiple di autoloading
developer
test produzione
Autoloadingin stile ZF1
Autoloading Namespace/Prefissooppure Class-map
Script digenerazioneclass_map
AutoloadingClass-map
sviluppo
© All rights reserved. Zend Technologies, Inc.
Dependency Injection
© All rights reserved. Zend Technologies, Inc.
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.
Esempio in PHP
class Foo { protected $bar; … public function __construct() { $this->bar= new Bar(); } …}
Senza Di Con Di (in costruzione)
Contro:Difficoltà di testingAccoppiamentoDifficoltà nel riutilizzo
Pro:Facilità di test (mock)CoesioneSemplice riutilizzo
class Foo { protected $bar; … public function __construct(Bar $bar) { $this->bar = $bar; } …}
© All rights reserved. Zend Technologies, Inc.
Di tramite set
class Foo { protected $bar; … public function setBar(Bar $bar) { $this->bar = $bar; } …}
© All rights reserved. Zend Technologies, Inc.
Zend\Di
● 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.
Esempio di definizione
$definition = array( 'Foo' => array( 'setBar' => array( 'bar' => array( 'type' => 'Bar', 'required' => true, ), ), ), );
© All rights reserved. Zend Technologies, Inc.
Utilizzo di un Di container
use Zend\Di\Di, Zend\Di\Configuration; $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.
Di tramite annotazione
namespace Foo\Bar { use Zend\Di\Definition\Annotation as Di;
class Baz { public $bam; /** * @Di\Inject() */ public function setBam(Bam $bam){ $this->bam = $bam; } }
class Bam { }}
© All rights reserved. Zend Technologies, Inc.
Di tramite annotazione (2)
$compiler = new Zend\Di\Definition\CompilerDefinition();$compiler->addDirectory('percorso di Bar e Baz');$compiler->compile();
$definitions = new Zend\Di\DefinitionList($compiler);$di = new Zend\Di\Di($definitions);
$baz = $di->get('Foo\Bar\Baz');
Per conoscere più casi d'uso di Zend\Di:https://github.com/ralphschindler/zf2-di-use-cases
© All rights reserved. Zend Technologies, Inc.
Event Manager
© All rights reserved. Zend Technologies, Inc.
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.
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.
Esempio
use Zend\EventManager\EventManager;
$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.
MVC
© All rights reserved. Zend Technologies, Inc.
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.
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.
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.
Esempio
● modules/● Foo/● Module.php
© All rights reserved. Zend Technologies, Inc.
Module.php
namespace Foo; class Module { }
● Di solito all'interno dei moduli sono presenti:▶ Autoloading▶ Configurazioni di base
© All rights reserved. Zend Technologies, Inc.
index.php
use Zend\Module\Manager, Zend\Mvc\Bootstrap, Zend\Mvc\Application;
$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.
Controller
namespace Foo\Controller; use Zend\Mvc\Controller\ActionController; class HelloController extends ActionController{ public function worldAction() { $query = $this->request->query(); $message = $query->get('message', 'Nobody'); return array('message' => $message); }}
© All rights reserved. Zend Technologies, Inc.
Render di una vista
use Zend\EventManager\EventCollection as Events, Zend\EventManager\ListenerAggregate;
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.
Gestione delle dipendenze
namespace Contact\Controller; use Zend\Mail\Transport, Zend\Mvc\Controller\ActionController;
class ContactController extends ActionController{ public function setMailer(Transport $transport) { $this->transport = $transport; }}
© All rights reserved. Zend Technologies, Inc.
Configurazione
return array('di' => array( 'definition' => array('class' => array( 'Zend\Mail\Transport\Smtp' => array( '__construct' => array( 'host' => array('required' => true, 'type' => false), 'user' => array('required' => true, 'type' => false), 'pass' => array('required' => true, 'type' => false), ), ), )), 'instance' => array( 'Zend\Mail\Transport' => array('parameters' => array( 'host' => 'some.host.tld', 'user' => 'user', 'pass' => 'pass' )), ),);
© All rights reserved. Zend Technologies, Inc.
Gestione dei package
© All rights reserved. Zend Technologies, Inc.
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.
Prossime release
© All rights reserved. Zend Technologies, Inc.
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.
Riferimenti
● Sito ufficiale
▶ http://framework.zend.com● ZF2 wiki:
▶ http://bit.ly/zf2wiki● zf-contributors mailing list:
▶ [email protected]● 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.
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.
Domande?
© All rights reserved. Zend Technologies, Inc.
Grazie!
Per maggiori informazioni:http://framework.zend.com/