Intervenant:   Benoît DURAND       b.durand at epixelic dot com




                               Zend Framework 2
                                                       (beta2)




21/12/2011                                        Développement
Architecture
L’architecture de ZF1
1. Singletons
2. Registres
3. Dépendances codées « en dur »




21/12/2011           ZF2           3
Un nouveau cœur pour ZF2
1. Programmation orientée aspect
2. SOLID
3. Exploiter pleinement le protocole HTTP




21/12/2011            ZF2                   4
Autoload
Autoload
1. Suppression des appels à require_once




21/12/2011            ZF2                  6
Autoload
1. Suppression des appels à require_once
2. Compatible PSR-0




21/12/2011            ZF2                  7
Autoload
1. Suppression des appels à require_once
2. Compatible PSR-0
3. Chargement par namespace, et par préfix




21/12/2011            ZF2                    8
Autoload
1.    Suppression des appels à require_once
2.    Compatible PSR-0
3.    Chargement par namespace, et par préfix
4.    Chargement avec une classmap




21/12/2011               ZF2                    9
Autoload
1.    Suppression des appels à require_once
2.    Compatible PSR-0
3.    Chargement par namespace, et par préfix
4.    Chargement avec une classmap




21/12/2011               ZF2                    10
Injection de dépendances
Injection de dépendances
• Découpler les dépendances entre deux
  composants
• Respecter la séparation des responsabilités




21/12/2011             ZF2                      12
Di : exemple (1)
// Dépendance forte
class Paginator
{
   public function __construct() {
     $this->adapter = new Array();
   }
}



21/12/2011               ZF2         13
Di : exemple (2)
// Dépendance faible
class Paginator
{
   public function __construct(Adapter $adapter) {
     $this->adapter = $adapter;
   }
}



21/12/2011               ZF2                         14
Di : trois types de définitions
1. Constructeur
2. Setter
3. Annotation




21/12/2011          ZF2           15
Di : trois stratégies
1. A l’exécution
2. Par compilation
3. Builder




21/12/2011              ZF2   16
Gestion par évènements
Vocabulaire
1. Un event est une action
2. Un listener est une fonction qui peut réagir à
   un event
3. Un EventManager est un objet qui agrège
   des listeners pour un ou plusieurs events, et
   qui déclenche ces events




21/12/2011              ZF2                     18
EventManager : exemple
use ZendEventManagerEventManager;

$events = new EventManager;
$events->attach(‘do’, function($e) {
    printf(‘Evènement %s avec les paramètres %s’,
       $e->getName(),
       json_encode($e->getParams())
    );
});

$params = array(‘foo’ => ‘bar’, ‘baz’ => ‘bat’);
$events->trigger(‘do’, null, $params);
// Affiche Evènement do avec les paramètres {"foo":"bar","baz":"bat"}



21/12/2011                        ZF2                               19
MVC
Architecture
• Une application est composée d’un router,
  d’un locator, et d’un event manager
• Une route doit retourner le nom d’un
  contrôleur
• Le contrôleur est récupéré depuis le locator,
  et exécuté
• Route et dispatch sont deux events



21/12/2011              ZF2                       21
Gotta dispatch them all
• Applications MVC




21/12/2011           ZF2   22
Gotta dispatch them all
• Applications MVC
• Classes serveur (Amf, Json, Soap, XmlRpc)




21/12/2011             ZF2                    23
Gotta dispatch them all
• Applications MVC
• Classes serveur (Amf, Json, Soap, XmlRpc)
• Clients HTTP




21/12/2011             ZF2                    24
Modules
Définition



      « Un module est un ensemble de classes
           et d’autres fichiers qui résout
              un problème spécifique
         au sein d’une application métier. »
                                         ZF2 RFC




21/12/2011              ZF2                    26
Architecture
• C’est l’unité de base d’une application MVC
  ZF2




21/12/2011             ZF2                      27
Architecture
• C’est l’unité de base d’une application MVC
  ZF2
• C’est simple à créer :
      – Un espace de nom




21/12/2011                 ZF2                  28
Architecture
• C’est l’unité de base d’une application MVC
  ZF2
• C’est simple à créer :
      – Un espace de nom
      – Une seule classe obligatoire : Module




21/12/2011                   ZF2                29
Exemple
// modules/EpxBlog/Module.php
namespace EpxBlog;

class Module {}




21/12/2011             ZF2      30
Module.php : cas d’utilisation
// modules/EpxBlog/Module.php
namespace EpxBlog;

class Module
{
   // Chargement automatique des ressources
   public function getAutoloaderConfig() {}

    // Configuration de base du module
    public function getConfig() {}
}

21/12/2011                 ZF2                31
Que contient un module ?
• Du code PHP (avec ou sans MVC)




21/12/2011           ZF2           32
Que contient un module ?
• Du code PHP (avec ou sans MVC)
• Des fichiers statiques (styles, javascript,
  images, etc)




21/12/2011               ZF2                    33
Que contient un module ?
• Du code PHP (avec ou sans MVC)
• Des fichiers statiques (styles, javascript,
  images, etc)
• Des tests unitaires




21/12/2011               ZF2                    34
Que contient un module ?
• Du code PHP (avec ou sans MVC)
• Des fichiers statiques (styles, javascript,
  images, etc)
• Des tests unitaires
• La documentation




21/12/2011               ZF2                    35
Que contient un module ?
• Du code PHP (avec ou sans MVC)
• Des fichiers statiques (styles, javascript,
  images, etc)
• Des tests unitaires
• La documentation
• Ce que vous voulez




21/12/2011               ZF2                    36
Contrôleur
 namespace EpxBlogController;

 use ZendMvcControllerActionController;

 class ArticleController extends ActionController
 {
    public function viewAction()
    {
      $query = $this->getRequest()->query();
      return array('titre' => $query->get('slug'));
    }
 }

21/12/2011                   ZF2                      37
Vue
 use ZendEventManagerEventCollection,
   ZendEventManagerListenerAggregate;

 class ViewListener implements ListenerAggregate
 {
    public function attach(EventCollection $events)
    {
      $events->attach('dispatch', array(
          $this, 'renderView', -100
      ));
    }

     /* … */
 }


21/12/2011                         ZF2                38
Dépendance
 namespace EpxBlogController;

 use ZendMvcControllerActionController,
   PDO as DbAdapter;

 class ArticleController extends ActionController
 {
    public function setDbAdapter(DbAdapter $dbAdapter)
    {
      $this->dbAdapter = $dbAdapter;
    }
 }

21/12/2011                 ZF2                       39
Configuration via le Di
 // config/autoload/database.php
 return array(
    ‘di’ => array(
       ‘PDO’ => array(
          ‘parameters’ => array(
            ‘dsn’ => ‘mysql:dbname=XXXX;host=XXXX’,
            ‘username’ => ‘XXXX’,
            ‘password’ => ‘XXXX’,
          )
       )
    )
 );

21/12/2011                 ZF2                        40
Liens
•   http://framework.zend.com/zf2
•   https://github.com/zendframework
•   http://packages.zendframework.com/
•   http://modules.zendframework.com/




11/04/2011                 Git           41
Questions ?




21/12/2011        ZF2      42

Zend Framework 2

  • 1.
    Intervenant: Benoît DURAND b.durand at epixelic dot com Zend Framework 2 (beta2) 21/12/2011 Développement
  • 2.
  • 3.
    L’architecture de ZF1 1.Singletons 2. Registres 3. Dépendances codées « en dur » 21/12/2011 ZF2 3
  • 4.
    Un nouveau cœurpour ZF2 1. Programmation orientée aspect 2. SOLID 3. Exploiter pleinement le protocole HTTP 21/12/2011 ZF2 4
  • 5.
  • 6.
    Autoload 1. Suppression desappels à require_once 21/12/2011 ZF2 6
  • 7.
    Autoload 1. Suppression desappels à require_once 2. Compatible PSR-0 21/12/2011 ZF2 7
  • 8.
    Autoload 1. Suppression desappels à require_once 2. Compatible PSR-0 3. Chargement par namespace, et par préfix 21/12/2011 ZF2 8
  • 9.
    Autoload 1. Suppression des appels à require_once 2. Compatible PSR-0 3. Chargement par namespace, et par préfix 4. Chargement avec une classmap 21/12/2011 ZF2 9
  • 10.
    Autoload 1. Suppression des appels à require_once 2. Compatible PSR-0 3. Chargement par namespace, et par préfix 4. Chargement avec une classmap 21/12/2011 ZF2 10
  • 11.
  • 12.
    Injection de dépendances •Découpler les dépendances entre deux composants • Respecter la séparation des responsabilités 21/12/2011 ZF2 12
  • 13.
    Di : exemple(1) // Dépendance forte class Paginator { public function __construct() { $this->adapter = new Array(); } } 21/12/2011 ZF2 13
  • 14.
    Di : exemple(2) // Dépendance faible class Paginator { public function __construct(Adapter $adapter) { $this->adapter = $adapter; } } 21/12/2011 ZF2 14
  • 15.
    Di : troistypes de définitions 1. Constructeur 2. Setter 3. Annotation 21/12/2011 ZF2 15
  • 16.
    Di : troisstratégies 1. A l’exécution 2. Par compilation 3. Builder 21/12/2011 ZF2 16
  • 17.
  • 18.
    Vocabulaire 1. Un eventest une action 2. Un listener est une fonction qui peut réagir à un event 3. Un EventManager est un objet qui agrège des listeners pour un ou plusieurs events, et qui déclenche ces events 21/12/2011 ZF2 18
  • 19.
    EventManager : exemple useZendEventManagerEventManager; $events = new EventManager; $events->attach(‘do’, function($e) { printf(‘Evènement %s avec les paramètres %s’, $e->getName(), json_encode($e->getParams()) ); }); $params = array(‘foo’ => ‘bar’, ‘baz’ => ‘bat’); $events->trigger(‘do’, null, $params); // Affiche Evènement do avec les paramètres {"foo":"bar","baz":"bat"} 21/12/2011 ZF2 19
  • 20.
  • 21.
    Architecture • Une applicationest composée d’un router, d’un locator, et d’un event manager • Une route doit retourner le nom d’un contrôleur • Le contrôleur est récupéré depuis le locator, et exécuté • Route et dispatch sont deux events 21/12/2011 ZF2 21
  • 22.
    Gotta dispatch themall • Applications MVC 21/12/2011 ZF2 22
  • 23.
    Gotta dispatch themall • Applications MVC • Classes serveur (Amf, Json, Soap, XmlRpc) 21/12/2011 ZF2 23
  • 24.
    Gotta dispatch themall • Applications MVC • Classes serveur (Amf, Json, Soap, XmlRpc) • Clients HTTP 21/12/2011 ZF2 24
  • 25.
  • 26.
    Définition « Un module est un ensemble de classes et d’autres fichiers qui résout un problème spécifique au sein d’une application métier. » ZF2 RFC 21/12/2011 ZF2 26
  • 27.
    Architecture • C’est l’unitéde base d’une application MVC ZF2 21/12/2011 ZF2 27
  • 28.
    Architecture • C’est l’unitéde base d’une application MVC ZF2 • C’est simple à créer : – Un espace de nom 21/12/2011 ZF2 28
  • 29.
    Architecture • C’est l’unitéde base d’une application MVC ZF2 • C’est simple à créer : – Un espace de nom – Une seule classe obligatoire : Module 21/12/2011 ZF2 29
  • 30.
  • 31.
    Module.php : casd’utilisation // modules/EpxBlog/Module.php namespace EpxBlog; class Module { // Chargement automatique des ressources public function getAutoloaderConfig() {} // Configuration de base du module public function getConfig() {} } 21/12/2011 ZF2 31
  • 32.
    Que contient unmodule ? • Du code PHP (avec ou sans MVC) 21/12/2011 ZF2 32
  • 33.
    Que contient unmodule ? • Du code PHP (avec ou sans MVC) • Des fichiers statiques (styles, javascript, images, etc) 21/12/2011 ZF2 33
  • 34.
    Que contient unmodule ? • Du code PHP (avec ou sans MVC) • Des fichiers statiques (styles, javascript, images, etc) • Des tests unitaires 21/12/2011 ZF2 34
  • 35.
    Que contient unmodule ? • Du code PHP (avec ou sans MVC) • Des fichiers statiques (styles, javascript, images, etc) • Des tests unitaires • La documentation 21/12/2011 ZF2 35
  • 36.
    Que contient unmodule ? • Du code PHP (avec ou sans MVC) • Des fichiers statiques (styles, javascript, images, etc) • Des tests unitaires • La documentation • Ce que vous voulez 21/12/2011 ZF2 36
  • 37.
    Contrôleur namespace EpxBlogController; use ZendMvcControllerActionController; class ArticleController extends ActionController { public function viewAction() { $query = $this->getRequest()->query(); return array('titre' => $query->get('slug')); } } 21/12/2011 ZF2 37
  • 38.
    Vue use ZendEventManagerEventCollection, ZendEventManagerListenerAggregate; class ViewListener implements ListenerAggregate { public function attach(EventCollection $events) { $events->attach('dispatch', array( $this, 'renderView', -100 )); } /* … */ } 21/12/2011 ZF2 38
  • 39.
    Dépendance namespace EpxBlogController; use ZendMvcControllerActionController, PDO as DbAdapter; class ArticleController extends ActionController { public function setDbAdapter(DbAdapter $dbAdapter) { $this->dbAdapter = $dbAdapter; } } 21/12/2011 ZF2 39
  • 40.
    Configuration via leDi // config/autoload/database.php return array( ‘di’ => array( ‘PDO’ => array( ‘parameters’ => array( ‘dsn’ => ‘mysql:dbname=XXXX;host=XXXX’, ‘username’ => ‘XXXX’, ‘password’ => ‘XXXX’, ) ) ) ); 21/12/2011 ZF2 40
  • 41.
    Liens • http://framework.zend.com/zf2 • https://github.com/zendframework • http://packages.zendframework.com/ • http://modules.zendframework.com/ 11/04/2011 Git 41
  • 42.