Sviluppo di applicazioni PHP conZend FrameworkLe novità della versione 2.0 e stato dellarte del progettoEnrico Zimuel (enr...
Sommario●    Perchè utilizzare un framework di sviluppo?●    Introduzione a Zend Framework●    Caratteristiche del progett...
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    lim...
Vantaggi nellutilizzo di un framework●    Velocità di sviluppo        ▶   Riduzione del time to market●    Standard nella ...
Come scegliere un framework●   Diffusione del framework●    Documentazione●    Supporto●   Licenza dutilizzo●    Curva di ...
Esempi di framework software●   Java                                 ●     Perl           ▶   Spring                      ...
Zend Framework    © All rights reserved. Zend Technologies, Inc.
Zend Framework●    Framework PHP per lo sviluppo di applicazioni web       ▶   > 10 milioni di download       ▶   > 500 sv...
Zend Technologies●   Zend Technologies Ltd, the PHP Company●   Fondata nel 1999 da Andi Gutmans e Zeev Suraski, gli    svi...
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 20...
Breve storia di ZF (2)●   Agosto 2010: Zend Framework 2.0.0dev1●   Novembre 2010: 1.11.0        ▶   Supporto dispositivi m...
Caratteristiche di ZF●    Architettura aperta        ▶   Facile integrazione in progetti di terze parti        ▶   Design ...
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 f...
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      ...
Nuovo approccio●    In ZF1:       ▶   Singletons, Registries, e dipendenze tra classi              scritte nel codice (har...
Nuova architettura●    Metodologie utilizzate nello sviluppo       ▶   Decoupling (ZendDi)       ▶   Orientata agli eventi...
Autoloading  © All rights reserved. Zend Technologies, Inc.
Autoloading●    Niente più require_once!●   Più soluzioni di autoloading:      ▶   In stile ZF1 include_path      ▶   Basa...
In stile ZF1require_once Zend/Loader/StandardAutoloader.php;$loader = new ZendLoaderStandardAutoloader(array(    fallback_...
Namespace/prefissorequire_once Zend/Loader/StandardAutoloader.php;$loader = new ZendLoaderStandardAutoloader();$loader->re...
Class-mapreturn array(    MyFooBar => __DIR__ . /Foo/Bar.php,);                                                           ...
Generazione automatica di class-map●    Script per la generazione automatica di class-map:      bin/classmap_generator.php...
Performance ●   Class-Maps offre un miglioramento del 25%       rispetto allautoloading di ZF1, senza lutilizzo di       u...
Esempio: strategie multiple di autoloading     sviluppo                         test                                      ...
Dependency Injection  © All rights reserved. Zend Technologies, Inc.
Dependency injection●    Come gestire la dipendenza tra oggetti?●    La Dependency injection (Di) è un design pattern per ...
Esempio in PHP           Senza Di                                          Con Di (in costruzione)class Foo {             ...
Di tramite setclass Foo {   protected $bar;   …   public function setBar(Bar $bar) {      $this->bar = $bar;   }   …}     ...
ZendDi●   Supporta differenti pattern:       – In costruzione (constructor)       – Interfaccia       – Tramite set●    Im...
Esempio di definizione $definition = array(     Foo => array(         setBar => array(             bar => array(          ...
Utilizzo di un Di container use ZendDiDi,     ZendDiConfiguration; $di     = new Di; $config = new Configuration(array(   ...
Di tramite annotazione namespace FooBar {    use ZendDiDefinitionAnnotation as Di;     class Baz {        public $bam;    ...
Di tramite annotazione (2)$compiler = new ZendDiDefinitionCompilerDefinition();$compiler->addDirectory(percorso di Bar e B...
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 cach...
Event Manager●    Event Manager è un oggetto per lascolto (listener)    di uno o più eventi●    Un listener è un riferimen...
Esempiouse ZendEventManagerEventManager;$events = new EventManager();$events->attach(do, function($e) {    $event = $e->ge...
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ù...
Terminologia in ZF2●    Applicazione: è un insieme di codice che risolve uno    specifico problema di business. Idealmente...
Moduli●    Il componente base di unapplicazione MVC    con ZF2 è il modulo●    La struttura di un modulo è semplice:      ...
Esempio●    modules/●     Foo/●       Module.php                 © All rights reserved. Zend Technologies, Inc.
Module.php     namespace Foo;     class Module { }●   Di solito allinterno dei moduli sono presenti:       ▶   Autoloading...
index.phpuse ZendModuleManager,    ZendMvcBootstrap,    ZendMvcApplication;$config = include __DIR__. /../configs/app.conf...
Controllernamespace FooController;use ZendMvcControllerActionController;class HelloController extends ActionController{   ...
Render di una vistause ZendEventManagerEventCollection as Events,    ZendEventManagerListenerAggregate;class ViewListener ...
Gestione delle dipendenzenamespace ContactController;use ZendMailTransport,    ZendMvcControllerActionController;class Con...
Configurazionereturn array(di => array(  definition => array(class => array(    ZendMailTransportSmtp => array(      __con...
Gestione dei package      © All rights reserved. Zend Technologies, Inc.
Package in ZF2 ●     http://packages.zendframework.com/ ●   Codici sorgenti (download + github) ●     Pyrus package:      ...
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        ...
Riferimenti●    Sito ufficiale        ▶   http://framework.zend.com●    ZF2 wiki:        ▶   http://bit.ly/zf2wiki●    zf-...
Risorse ●     SVN ZF1:        ▶   http://framework.zend.com/svn/framework/ ●   Git guide ZF2:        ▶ http://bit.ly/zf2gi...
Domande?           © All rights reserved. Zend Technologies, Inc.
Grazie!Per maggiori informazioni:http://framework.zend.com/                 © All rights reserved. Zend Technologies, Inc.
Upcoming SlideShare
Loading in...5
×

Zend Framework 2

7,529

Published on

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

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,529
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
91
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

Zend Framework 2

  1. 1. Sviluppo di applicazioni PHP conZend FrameworkLe novità della versione 2.0 e stato dellarte del progettoEnrico Zimuel (enrico@zend.com)Senior PHP Engineer, Zend TechnologiesZend Framework Core TeamPUG Torino, 26 Gennaio 2012 © All rights reserved. Zend Technologies, Inc.
  2. 2. Sommario● Perchè utilizzare un framework di sviluppo?● Introduzione a Zend Framework● Caratteristiche del progetto● La versione 1.x● La nuova release 2.0● Larchitettura di ZF2● Futuro di ZF2 © All rights reserved. Zend Technologies, Inc.
  3. 3. Perchè utilizzare un framework? © All rights reserved. Zend Technologies, Inc.
  4. 4. Framework● Un framework di sviluppo è un insieme di librerie o classi riutilizzabili, studiate per facilitare limplementazione di un progetto software.● Caratteristiche di un framework: ▶ Riusabilità ▶ Standardizzazione ▶ Estensibilità ▶ Qualità del codice ▶ Sicurezza © All rights reserved. Zend Technologies, Inc.
  5. 5. Vantaggi nellutilizzo 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. 6. Come scegliere un framework● Diffusione del framework● Documentazione● Supporto● Licenza dutilizzo● Curva di apprendimento © All rights reserved. Zend Technologies, Inc.
  7. 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.
  8. 8. Zend Framework © All rights reserved. Zend Technologies, Inc.
  9. 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. 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 (linterprete del PHP)● Sito: http://www.zend.com © All rights reserved. Zend Technologies, Inc.
  11. 11. Alcuni progetti basati su ZF © All rights reserved. Zend Technologies, Inc.
  12. 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. 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. 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 ▶ ≈ 460000 linee di codice ▶ Reference guide > 1000 pagine © All rights reserved. Zend Technologies, Inc.
  15. 15. Model View Controller in ZF © All rights reserved. Zend Technologies, Inc.
  16. 16. Componenti del progetto ZF 1 © All rights reserved. Zend Technologies, Inc.
  17. 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.
  18. 18. Zend Framework 2.0 © All rights reserved. Zend Technologies, Inc.
  19. 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. 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. 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.
  22. 22. Autoloading © All rights reserved. Zend Technologies, Inc.
  23. 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. 24. In stile ZF1require_once Zend/Loader/StandardAutoloader.php;$loader = new ZendLoaderStandardAutoloader(array( fallback_autoloader => true,));$loader->register(); © All rights reserved. Zend Technologies, Inc.
  25. 25. Namespace/prefissorequire_once Zend/Loader/StandardAutoloader.php;$loader = new ZendLoaderStandardAutoloader();$loader->registerNamespace( My, __DIR__ . /../library/My) ->registerPrefix( Foo_, __DIR__ . /../library/Foo);$loader->register(); © All rights reserved. Zend Technologies, Inc.
  26. 26. Class-mapreturn array( MyFooBar => __DIR__ . /Foo/Bar.php,); .classmap.phprequire_once Zend/Loader/ClassMapAutoloader.php;$loader = new ZendLoaderClassMapAutoloader();$loader->registerAutoloadMap( __DIR__ . /../library/.classmap.php);$loader->register(); © All rights reserved. Zend Technologies, Inc.
  27. 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. 28. Performance ● Class-Maps offre un miglioramento del 25% rispetto allautoloading di ZF1, senza lutilizzo 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. 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.
  30. 30. Dependency Injection © All rights reserved. Zend Technologies, Inc.
  31. 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. 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. 33. Di tramite setclass Foo { protected $bar; … public function setBar(Bar $bar) { $this->bar = $bar; } …} © All rights reserved. Zend Technologies, Inc.
  34. 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 lautodiscover delle classi e delle loro dipendenze © All rights reserved. Zend Technologies, Inc.
  35. 35. Esempio di definizione $definition = array( Foo => array( setBar => array( bar => array( type => Bar, required => true, ), ), ), ); © All rights reserved. Zend Technologies, Inc.
  36. 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. 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. 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 duso di ZendDi:https://github.com/ralphschindler/zf2-di-use-cases © All rights reserved. Zend Technologies, Inc.
  39. 39. Event Manager © All rights reserved. Zend Technologies, Inc.
  40. 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. 41. Event Manager● Event Manager è un oggetto per lascolto (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 è unazione che viene eseguita © All rights reserved. Zend Technologies, Inc.
  42. 42. Esempiouse 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.
  43. 43. MVC© All rights reserved. Zend Technologies, Inc.
  44. 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 unazione, 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. 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 allinterno di una libreria. © All rights reserved. Zend Technologies, Inc.
  46. 46. Moduli● Il componente base di unapplicazione MVC con ZF2 è il modulo● La struttura di un modulo è semplice: ▶ Un namespace ▶ Ununica classe, denominata Module.php © All rights reserved. Zend Technologies, Inc.
  47. 47. Esempio● modules/● Foo/● Module.php © All rights reserved. Zend Technologies, Inc.
  48. 48. Module.php namespace Foo; class Module { }● Di solito allinterno dei moduli sono presenti: ▶ Autoloading ▶ Configurazioni di base © All rights reserved. Zend Technologies, Inc.
  49. 49. index.phpuse 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.
  50. 50. Controllernamespace FooController;use ZendMvcControllerActionController;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.
  51. 51. Render di una vistause 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. 52. Gestione delle dipendenzenamespace ContactController;use ZendMailTransport, ZendMvcControllerActionController;class ContactController extends ActionController{ public function setMailer(Transport $transport) { $this->transport = $transport; }} © All rights reserved. Zend Technologies, Inc.
  53. 53. Configurazionereturn 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.
  54. 54. Gestione dei package © All rights reserved. Zend Technologies, Inc.
  55. 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 . channel­discover  packages.zendframework.com ▶ pyrus.phar . install zf2/<zf­package> ▶ pyrus.phar . install zf2/Zend_<component> © All rights reserved. Zend Technologies, Inc.
  56. 56. Prossime release © All rights reserved. Zend Technologies, Inc.
  57. 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. 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. 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 desempio ZF2: ▶ https://github.com/EvanDotPro/ZendSkeletonApplication © All rights reserved. Zend Technologies, Inc.
  60. 60. Domande? © All rights reserved. Zend Technologies, Inc.
  61. 61. Grazie!Per maggiori informazioni:http://framework.zend.com/ © All rights reserved. Zend Technologies, Inc.
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×