Zend Framework 2

61
© All rights reserved. Zend Technologies, Inc. Sviluppo di applicazioni PHP con Zend Framework Le novità della versione 2.0 e stato dell'arte del progetto Enrico Zimuel ([email protected]) Senior PHP Engineer, Zend Technologies Zend Framework Core Team PUG Torino, 26 Gennaio 2012

description

Sviluppo di applicazioni web in PHP con Zend Framework. Le novità della versione 2 e stato dell'arte del progetto

Transcript of Zend Framework 2

Page 1: 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

Page 2: Zend Framework 2

© 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

Page 3: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Perchè utilizzare un framework?

Page 4: Zend Framework 2

© 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

Page 5: Zend Framework 2

© 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

Page 6: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Come scegliere un framework

● Diffusione del framework● Documentazione ● Supporto● Licenza d'utilizzo● Curva di apprendimento

Page 7: Zend Framework 2

© 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

Page 8: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Zend Framework

Page 9: Zend Framework 2

© 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.

Page 10: Zend Framework 2

© 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

Page 11: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Alcuni progetti basati su ZF

Page 12: Zend Framework 2

© 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

Page 13: Zend Framework 2

© 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

Page 14: Zend Framework 2

© 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

Page 15: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Model View Controller in ZF

Page 16: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Componenti del progetto ZF 1

Page 17: Zend Framework 2

© 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)

Page 18: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Zend Framework 2.0

Page 19: Zend Framework 2

© 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

Page 20: Zend Framework 2

© 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

Page 21: Zend Framework 2

© 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::)

Page 22: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Autoloading

Page 23: Zend Framework 2

© 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

Page 24: Zend Framework 2

© 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();

Page 25: Zend Framework 2

© 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();

Page 26: Zend Framework 2

© 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

Page 27: Zend Framework 2

© 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

Page 28: Zend Framework 2

© 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

Page 29: Zend Framework 2

© 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

Page 30: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Dependency Injection

Page 31: Zend Framework 2

© 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

Page 32: Zend Framework 2

© 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; } …}

Page 33: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Di tramite set

class Foo { protected $bar; … public function setBar(Bar $bar) { $this->bar = $bar; } …}

Page 34: Zend Framework 2

© 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

Page 35: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Esempio di definizione

$definition = array( 'Foo' => array( 'setBar' => array( 'bar' => array( 'type' => 'Bar', 'required' => true, ), ), ), );

Page 36: Zend Framework 2

© 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

Page 37: Zend Framework 2

© 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 { }}

Page 38: Zend Framework 2

© 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

Page 39: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Event Manager

Page 40: Zend Framework 2

© 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?

Page 41: Zend Framework 2

© 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

Page 42: Zend Framework 2

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

Page 43: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

MVC

Page 44: Zend Framework 2

© 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

Page 45: Zend Framework 2

© 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.

Page 46: Zend Framework 2

© 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

Page 47: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Esempio

● modules/● Foo/● Module.php

Page 48: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Module.php

namespace Foo; class Module { }

● Di solito all'interno dei moduli sono presenti:▶ Autoloading▶ Configurazioni di base

Page 49: Zend Framework 2

© 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();

Page 50: Zend Framework 2

© 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); }}

Page 51: Zend Framework 2

© 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); }

/* ... */}

Page 52: Zend Framework 2

© 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; }}

Page 53: Zend Framework 2

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

Page 54: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Gestione dei package

Page 55: Zend Framework 2

© 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 . channel­discover packages.zendframework.com

▶ pyrus.phar . install zf2/<zf­package>▶ pyrus.phar . install zf2/Zend_<component>

Page 56: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Prossime release

Page 57: Zend Framework 2

© 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)▶ ...

Page 58: Zend Framework 2

© 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)

Page 59: Zend Framework 2

© 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

Page 60: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Domande?

Page 61: Zend Framework 2

© All rights reserved. Zend Technologies, Inc.

Grazie!

Per maggiori informazioni:http://framework.zend.com/