SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
Utiliser le Zend Framework
avec Symfony
Xavier Gorse – ELAO

A partir du support de
Matthew Weier O'Phinney
Chef de Projet, Zend Framework




                                 © All rights reserved. Zend Technologies, Inc.
Xavier Gorse    - xavier.gorse@elao.com

●   Gérant de la société ELAO
●   Expertise, formation et
    développement d’application
    Symfony
●   Formateur Zend Technologies
●   Ancien président de L'AFUP
●   Membre de PHPTV



                      © All rights reserved. Zend Technologies, Inc.
Matthew Weier O'Phinney
●   Développeur PHP
    depuis 2000
●   Contributeur du Zend
    Framework depuis
    2006
●   Chef de projet depuis
    2009




                    © All rights reserved. Zend Technologies, Inc.
Zend Framework : quelques rappels




             © All rights reserved. Zend Technologies, Inc.
Le Zend Framework est …
●   une bibliothèque de composants ?
●   un framework full-stack ?
●   Réponse : les deux.




                    © All rights reserved. Zend Technologies, Inc.
© All rights reserved. Zend Technologies, Inc.
Comparatif Symfony / Zend Framework




            © All rights reserved. Zend Technologies, Inc.
Quelle importance ?
●   Tous deux sont des frameworks éprouvés
●   Chacun à sa manière soulage le développeur
●   Ils peuvent être utilisés conjointement
    (grâce aux composants Symfony, cela marche dans les
    deux sens !)




                      © All rights reserved. Zend Technologies, Inc.
Pourquoi utiliser ZF avec Symfony?




             © All rights reserved. Zend Technologies, Inc.
Tirer profit des fonctionnalités du ZF
●   Accès aux APIs distantes (web services,
    flux RSS, etc.)
●   Support de l'indexation à l'aide de Lucene
●   Generation de PDF
●   Mise en file d'attente
●   Cloud computing (stockage, bases de données,
    files de messages)



                     © All rights reserved. Zend Technologies, Inc.
Traitements asynchrones
●   Généralement : déporter certains traitements
    sur d'autres composants
       ▶   Files d'attente
●   Exemples:
       ▶   Envoi de notifications de mails
       ▶   Interaction avec des web services tierces
       ▶   Opérations en base de données coûteuses ou
             complexes
●   Cela peut nécessiter de lancer une console ou
    d'interagir avec une file de messages
                         © All rights reserved. Zend Technologies, Inc.
Exposer des Web Services
●   XML-RPC
●   SOAP
●   JSON-RPC
●   AMF




                © All rights reserved. Zend Technologies, Inc.
Comment utiliser le Zend Framework
avec Symfony?




            © All rights reserved. Zend Technologies, Inc.
Méthodes d'intégration
●   Généralement, en installant un plugin ou en
    configurant le projet




                    © All rights reserved. Zend Technologies, Inc.
class ProjectConfiguration
    extends sfProjectConfiguration
{
    static protected $zendAutoloader = false;

    static public function registerZend()
    {
        if (!self::$zendAutoloader) {
            set_include_path(implode(
                PATH_SEPARATOR, array(
                sfConfig::get('sf_lib_dir') . '/vendor',
                get_include_path(),
            )))
            require_once 'Zend/Loader/Autoloader.php';
            self::$zendAutoloader =
                Zend_Loader_Autoloader::getInstance();
        }
        return self::$zendAutoloader
    }
}


                      © All rights reserved. Zend Technologies, Inc.
Allons un peu plus loin ...


class ProjectConfiguration
    extends sfProjectConfiguration
{
    // ...

    // Autoload PEAR classes, too...
    static public function registerPear()
    {
        self::registerZend()->setFallbackAutoloader();
    }
}




                     © All rights reserved. Zend Technologies, Inc.
Utilisation des composants Zend :

  class readerReadTask extends sfBaseTask
  {
      // ...
      public function execute(
          $arguments = array(),
          $options = array()
      ) {
          // ...
          ProjectConfiguration::registerZend();
          $feed = Zend_Feed_Reader::import($feed);
          // ...
      }
  }        Il ne reste plus qu'à utiliser les classes!



                     © All rights reserved. Zend Technologies, Inc.
Quelques composants qui peuvent vous
           être utiles ...




             © All rights reserved. Zend Technologies, Inc.
Les composants “service” (Zend_Service)
●   Zend_Gdata
       ▶   Contacts, calendriers, and YouTube!
●   Zend_Service_Amazon
       ▶   Recherche de livres, S3 & EC2, SQS
             (prochainement)
●   Zend_Service_Akismet
       ▶   Détection de spams
●   Et beaucoup, beaucoup d'autres
       ▶   http://framework.zend.com/manual/fr/zend.service.html


                            © All rights reserved. Zend Technologies, Inc.
Les outils de syndication (Zend_Feed)
●   Zend_Feed_Reader – support complet pour
    consommer des flux, dont RSS (1 and 2) &
    Atom
●   Zend_Feed_Writer – le “miroir” de
    Zend_Feed_Reader, destiné à rédiger des flux
●   Zend_Feed_Pubsubhubbub – interaction avec
    les hubs PuSH, facilite la publication de flux et
    la souscription



                     © All rights reserved. Zend Technologies, Inc.
$feed = Zend_Feed_Reader::import($feedUri);
$metadata = array(
    'title'       => $feed->getTitle(),
    'description' => $feed->getDescription(),
);
$entries = array();
foreach ($feed as $entry) {
    $entries[] = array(
        'title'     => $entry->getTitle(),
        'link'      => $entry->getLink(),
        'timestamp' => $entry->getDateModified(),
    );
}




                   © All rights reserved. Zend Technologies, Inc.
$feed = new Zend_Feed_Writer_Feed;
$feed->setTitle($someTitle)
     ->setLink($url)
     ->setDescription($description);
$entry = $feed->createEntry();
$entry->setTitle($entryTitle)
      ->setLink($entryLink)
      ->setDateModified(time());
$feed->addEntry($entry);
echo $feed->export('atom');




            © All rights reserved. Zend Technologies, Inc.
L'indexation avec Lucene
●   Lucene est un format binaire optimisé pour
    l'indexation de documents et la recherche
    selon des critères complexes
●   Zend_Search_Lucene traite les index au
    format Lucene
       ▶   Supporte la recherche et l'exploitation de
             données basée sur des index au format
             Lucene
       ▶   Supporte la generation d'index au format
             Lucene

                        © All rights reserved. Zend Technologies, Inc.
if (is_dir($indexDir)) {
    $index = Zend_Search_Lucene::open($indexDir);
} else {
    $index = Zend_Search_Lucene::create($indexDir);
}
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Keyword(
    'uri', $url));
$doc-
>addField(Zend_Search_Lucene_Field::UnIndexed(
    'timestamp', $ts));
$doc->addField(Zend_Search_Lucene_Field::Text(
    'synopsis', $synopsis));
$doc->addField(Zend_Search_Lucene_Field::Unstored(
    'content', $content));

$index->addDocument($doc);


                    © All rights reserved. Zend Technologies, Inc.
$hits = $index->find('+hello -dolly');
foreach ($hits as $hit) {
    printf('<a href="%s">%s ... (created %s)</a>',
        $hit->uri,
        $hit->synopsis,
        $hit->timestamp
    );
}




                   © All rights reserved. Zend Technologies, Inc.
Traitement des fichiers PDF
●   PDF = une specification ouverte publiée par
    Adobe
●   Zend_Pdf permet de :
       ▶   Manipuler et exploiter des fichiers PDF existants
       ▶   Créer de nouveaux fichiers PDF




                        © All rights reserved. Zend Technologies, Inc.
$pdf = Zend_Pdf::load($pdfFile);
$page = $pdf->pages[0];
$font = Zend_Pdf_Font::fontWithName(
    Zend_Pdf_Font::FONT_HELVETICA
);
$page->setFont($font, 36)
     ->setFillColor(
        Zend_Pdf_Color_Html::color('#CCC'))
     ->drawText('U R H2O-marked', 60, 500);
$pdf->save($pdfFile);




                © All rights reserved. Zend Technologies, Inc.
Sortons du cadre :
Le cas des objets métiers




             © All rights reserved. Zend Technologies, Inc.
Pour quelle raison ?
 ●   Exécuter des tâches de traitement séparées et
     distinctes, sans recourir à l'artillerie lourde
     proposée par le framework
        ▶   Lorsqu'il est nécessaire de privilégier la vitesse
              d'exécution
        ▶   Lorsqu'il faut réduire au strict minimum les
              ressources utilisées
        ▶   Pour effectuer des traitements qui ne sont pas
              spécifiques à l'application Web (commandes
              en mode console, opérations en base de
              données, dialogue avec des web services,
              tâches périodiques, etc.)
                         © All rights reserved. Zend Technologies, Inc.
Autres raisons :
●   Tester unitairement les objets métiers
       ▶   Les tests sur la base de données ne sont pas des
             tests unitaires
       ▶   Raison principale : rendre les batteries de tests
             moins complexes
●   Réduire les dépendances
       ▶   Peut réduire la quantité de ressources utilisées
       ▶   Peut améliorer les performances (moins de
             bootstrapping et moins de ressources = code
             plus rapide)
●   Utiliser les objets dans différents contextes
                         © All rights reserved. Zend Technologies, Inc.
Rôle des objets métiers
●   Entities – souvent des “POPO” (Plain Old PHP
    Objects)
●   Données agrégées ou Collections – d'entities
●   Mappers – mapping entre les entities et les
    données persistantes, et vice-versa
    (essentiellement le rôle des ORM). Retournent des
    collections d'entities ou des données agrégées.
●   Les objets de la couche Service – API publique
    de vos objets métiers ; ils utilisent d'autres
    objets du domaine et fournissent la logique
    métier
                     © All rights reserved. Zend Technologies, Inc.
La couche “Service”


     Data Access Objects
     and Data store(s)


     Data Mappers

     Entities


     Service
     Layer
32                     © All rights reserved. Zend Technologies, Inc.
Quelques conseils
●   Les objets de la couche Service ne devraient
    retourner que des entités et/ou des données
    agrégées
●   Pensez à retourner des objets Zend_Paginator
       ▶   Implémentant l'interface Countable
       ▶   Implémentant l'interface Iterable
       ▶   Les utilisateurs de la couche Service n'ont pas à
             savoir comment les données ont été
             retournées


                        © All rights reserved. Zend Technologies, Inc.
Autres conseils
●   Implémenter la logique métier dans la couche
    Service
       ▶   Validation/Filtrage des données
       ▶   Interactions entre les entités
       ▶   Contrôles d'accès (ACLs)




                         © All rights reserved. Zend Technologies, Inc.
Retour dans le cadre :
Les traitements asynchrones




             © All rights reserved. Zend Technologies, Inc.
Les files d'attente (queues)
●   Reporter à plus tard l'exécution d'un
    traitement
●   Cas d'utilisation
       ▶   Envoyer un email
       ▶   Mettre à jour des index
       ▶   Interagir avec des API tierces (Salesforce,
              SugarCRM, etc)




                         © All rights reserved. Zend Technologies, Inc.
$queue = new Zend_Queue('MemcacheQ', array(
    'name' => 'my-uber-queue',
    'host' => 'queue.host.tld',
));
$queue->send('Some message');




    $messages = $queue->receive(5);
    echo count($queue), " messages registeredn";
    foreach ($messages as $message) {
        // do something with message,
        // typically $message->body
        $queue->deleteMessage($message);
    }i



                   © All rights reserved. Zend Technologies, Inc.
Exposer des Web Services




             © All rights reserved. Zend Technologies, Inc.
Objectifs d'un web service bien conçu
●   S'auto-documenter
●   Fournir des réponses rapides
●   Etre lié aux objets de la couche Service




                     © All rights reserved. Zend Technologies, Inc.
Type de services fournis par ZF
●   AMF (Active Message Format) - utilisé par
    Flex & Flash
●   JSON-RPC - RPC utilisant JSON comme format
    de serialization ; clients en Dojo, YUI et ExtJS
●   XML-RPC – protocole standard utilisé partout
●   SOAP – service fourni avec l'auto-generation du
    WSDL et la serialization vers et à partir
    d'objets PHP



                     © All rights reserved. Zend Technologies, Inc.
Procédure élémentaire
●   Tous les serveurs se conforment à l'API
    SoapServer de PHP
       ▶   Instanciation
       ▶   Ajout de classes et/ou de fonctions de callback
       ▶   Traitement de la requête




                           © All rights reserved. Zend Technologies, Inc.
$server = new Zend_XmlRpc_Server();
$server->setClass('My_Service_ApiClass', 'api');
echo $server->handle();



  if ($_SERVER['REQUEST_METHOD'] == 'GET') {
      $server = new Zend_Soap_AutoDiscover();
  } else {
      $server = new Zend_Soap_Server($thisScript);
  }
  $server->setClass('My_Service_ApiClass');
  $server->handle();



                    © All rights reserved. Zend Technologies, Inc.
Les objets de la couche Service sont rois !
●   Les méthodes publiques sont exposées par
    défaut
●   Définissez votre API publique dans la couche
    Service, et réutilisez-la en fonction de vos
    besoins
       ▶   Les contrôles d'accès, la validation, etc., sont
             déjà définies et encapsulées




                         © All rights reserved. Zend Technologies, Inc.
Ressources Ajax
●   Les requêtes AJAX doivent être rapides
       ▶   Pour les requêtes de type RPC,
             Zend_Json_Server est votre ami
       ▶   JSON-REST est de plus en plus populaire ;
             envisagez une solution RESTful MVC légère
             pour consommer vos objets Service, ou bien
             l'API REST de Symfony
●   Une fois de plus, les objets de la couche
    Service sont vos amis



                       © All rights reserved. Zend Technologies, Inc.
Récapitulons




               © All rights reserved. Zend Technologies, Inc.
●   Le Zend Framework fournit un large éventail
    de fonctionnalités utilisables dans vos
    applications Symfony.
●   Pensez à bâtir un modèle métier riche et
    indépendant de l'application qui s'appuie sur
    des composants variés.
●   Déportez les traitements chaque fois que vous
    le pouvez, et placez vos points d'entrée
    Service en dehors de l'application Web pour de
    meilleures performances.

                     © All rights reserved. Zend Technologies, Inc.
Ressources
●   Le manuel de ZF :
    http://framework.zend.com/manual
●   Ces diapositives sur Slideshare :
    http://slideshare.net/weierophinney
●   http://slideshare.net/xgorse




                    © All rights reserved. Zend Technologies, Inc.
Merci de votre attention !




              © All rights reserved. Zend Technologies, Inc.

Contenu connexe

Tendances

Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Hugo Hamon
 
Intégration continue & Qualité logicielle
Intégration continue & Qualité logicielleIntégration continue & Qualité logicielle
Intégration continue & Qualité logicielle
David Buros
 
Présentation de symfony - Human talks aux docks le 8 juillet 2014
Présentation de symfony - Human talks aux docks le 8 juillet 2014Présentation de symfony - Human talks aux docks le 8 juillet 2014
Présentation de symfony - Human talks aux docks le 8 juillet 2014
Tony Galmiche
 
NodeJS for Mobile App
NodeJS for Mobile AppNodeJS for Mobile App
NodeJS for Mobile App
Habib MAALEM
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
Hugo Hamon
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
Vincent Composieux
 

Tendances (20)

Symfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiquesSymfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiques
 
Le développement web : tour d'horizon
Le développement web : tour d'horizonLe développement web : tour d'horizon
Le développement web : tour d'horizon
 
Symfony 2 et le Web
Symfony 2 et le WebSymfony 2 et le Web
Symfony 2 et le Web
 
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
 
Intégration continue & Qualité logicielle
Intégration continue & Qualité logicielleIntégration continue & Qualité logicielle
Intégration continue & Qualité logicielle
 
Symfony 2 : chapitre 2 - Les vues en Twig
Symfony 2 : chapitre 2 - Les vues en TwigSymfony 2 : chapitre 2 - Les vues en Twig
Symfony 2 : chapitre 2 - Les vues en Twig
 
Formation Symfony2 par KNP Labs
Formation Symfony2 par KNP LabsFormation Symfony2 par KNP Labs
Formation Symfony2 par KNP Labs
 
Symfony3 overview
Symfony3 overviewSymfony3 overview
Symfony3 overview
 
PHP Composer : Pourquoi ? Comment ? Et plus ...
PHP Composer : Pourquoi ? Comment ? Et plus ...PHP Composer : Pourquoi ? Comment ? Et plus ...
PHP Composer : Pourquoi ? Comment ? Et plus ...
 
Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CI
 
Déploiement PHP : de l'âge de pierre à nos jours.
Déploiement PHP : de l'âge de pierre à nos jours.Déploiement PHP : de l'âge de pierre à nos jours.
Déploiement PHP : de l'âge de pierre à nos jours.
 
Présentation de symfony - Human talks aux docks le 8 juillet 2014
Présentation de symfony - Human talks aux docks le 8 juillet 2014Présentation de symfony - Human talks aux docks le 8 juillet 2014
Présentation de symfony - Human talks aux docks le 8 juillet 2014
 
AFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIAFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open API
 
20111006 bonnes pratiques-gi_g_v1
20111006 bonnes pratiques-gi_g_v120111006 bonnes pratiques-gi_g_v1
20111006 bonnes pratiques-gi_g_v1
 
Atelier Symfony2- Introduction
Atelier Symfony2- IntroductionAtelier Symfony2- Introduction
Atelier Symfony2- Introduction
 
NodeJS for Mobile App
NodeJS for Mobile AppNodeJS for Mobile App
NodeJS for Mobile App
 
Presentation Symfony
Presentation SymfonyPresentation Symfony
Presentation Symfony
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Symfony2 Presentation
Symfony2 PresentationSymfony2 Presentation
Symfony2 Presentation
 

En vedette (6)

Lightweight directory access protocol
Lightweight directory access protocolLightweight directory access protocol
Lightweight directory access protocol
 
Réseaux internet
Réseaux internetRéseaux internet
Réseaux internet
 
Gestion des ui
Gestion des uiGestion des ui
Gestion des ui
 
Technologies d'accès à Internet
Technologies d'accès à InternetTechnologies d'accès à Internet
Technologies d'accès à Internet
 
Architecture VoIP Protocol H323
Architecture VoIP Protocol H323Architecture VoIP Protocol H323
Architecture VoIP Protocol H323
 
Club Optique Draka Amif 2010
Club Optique Draka Amif 2010Club Optique Draka Amif 2010
Club Optique Draka Amif 2010
 

Similaire à Utiliser le Zend Framework avec Symfony

Introduction à Zend Framework 2
Introduction à Zend Framework 2Introduction à Zend Framework 2
Introduction à Zend Framework 2
Mickael Perraud
 
20100221 my phingtool - blog
20100221   my phingtool - blog20100221   my phingtool - blog
20100221 my phingtool - blog
PHPPRO
 
Internationaliser un formulaire zend form
Internationaliser un formulaire zend formInternationaliser un formulaire zend form
Internationaliser un formulaire zend form
Geozend
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
Atsé François-Xavier KOBON
 
Zen02 formation-zend-framework-1-les-bases
Zen02 formation-zend-framework-1-les-basesZen02 formation-zend-framework-1-les-bases
Zen02 formation-zend-framework-1-les-bases
CERTyou Formation
 

Similaire à Utiliser le Zend Framework avec Symfony (20)

Introduction à Zend Framework 2
Introduction à Zend Framework 2Introduction à Zend Framework 2
Introduction à Zend Framework 2
 
Afup 2015 zf3 le futur de php
Afup 2015   zf3 le futur de phpAfup 2015   zf3 le futur de php
Afup 2015 zf3 le futur de php
 
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
 
Architecture PHP 3 tier avec Zend en backend de Drupal
Architecture PHP 3 tier avec Zend en backend de DrupalArchitecture PHP 3 tier avec Zend en backend de Drupal
Architecture PHP 3 tier avec Zend en backend de Drupal
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentation
 
Zf2 ce-qui-va-changer
Zf2 ce-qui-va-changerZf2 ce-qui-va-changer
Zf2 ce-qui-va-changer
 
mini projet
mini projetmini projet
mini projet
 
20100221 my phingtool - blog
20100221   my phingtool - blog20100221   my phingtool - blog
20100221 my phingtool - blog
 
Internationaliser un formulaire zend form
Internationaliser un formulaire zend formInternationaliser un formulaire zend form
Internationaliser un formulaire zend form
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Introduction à Zend Framework
Introduction à Zend FrameworkIntroduction à Zend Framework
Introduction à Zend Framework
 
PHP5 et Zend Framework
PHP5 et Zend FrameworkPHP5 et Zend Framework
PHP5 et Zend Framework
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
 
Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?
 
Pdo
PdoPdo
Pdo
 
The Spring of Adobe Flex Remoting
The Spring of Adobe Flex RemotingThe Spring of Adobe Flex Remoting
The Spring of Adobe Flex Remoting
 
Utilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHPUtilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHP
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Zen02 formation-zend-framework-1-les-bases
Zen02 formation-zend-framework-1-les-basesZen02 formation-zend-framework-1-les-bases
Zen02 formation-zend-framework-1-les-bases
 
Formation php pdo
Formation php pdoFormation php pdo
Formation php pdo
 

Utiliser le Zend Framework avec Symfony

  • 1. Utiliser le Zend Framework avec Symfony Xavier Gorse – ELAO A partir du support de Matthew Weier O'Phinney Chef de Projet, Zend Framework © All rights reserved. Zend Technologies, Inc.
  • 2. Xavier Gorse - xavier.gorse@elao.com ● Gérant de la société ELAO ● Expertise, formation et développement d’application Symfony ● Formateur Zend Technologies ● Ancien président de L'AFUP ● Membre de PHPTV © All rights reserved. Zend Technologies, Inc.
  • 3. Matthew Weier O'Phinney ● Développeur PHP depuis 2000 ● Contributeur du Zend Framework depuis 2006 ● Chef de projet depuis 2009 © All rights reserved. Zend Technologies, Inc.
  • 4. Zend Framework : quelques rappels © All rights reserved. Zend Technologies, Inc.
  • 5. Le Zend Framework est … ● une bibliothèque de composants ? ● un framework full-stack ? ● Réponse : les deux. © All rights reserved. Zend Technologies, Inc.
  • 6. © All rights reserved. Zend Technologies, Inc.
  • 7. Comparatif Symfony / Zend Framework © All rights reserved. Zend Technologies, Inc.
  • 8. Quelle importance ? ● Tous deux sont des frameworks éprouvés ● Chacun à sa manière soulage le développeur ● Ils peuvent être utilisés conjointement (grâce aux composants Symfony, cela marche dans les deux sens !) © All rights reserved. Zend Technologies, Inc.
  • 9. Pourquoi utiliser ZF avec Symfony? © All rights reserved. Zend Technologies, Inc.
  • 10. Tirer profit des fonctionnalités du ZF ● Accès aux APIs distantes (web services, flux RSS, etc.) ● Support de l'indexation à l'aide de Lucene ● Generation de PDF ● Mise en file d'attente ● Cloud computing (stockage, bases de données, files de messages) © All rights reserved. Zend Technologies, Inc.
  • 11. Traitements asynchrones ● Généralement : déporter certains traitements sur d'autres composants ▶ Files d'attente ● Exemples: ▶ Envoi de notifications de mails ▶ Interaction avec des web services tierces ▶ Opérations en base de données coûteuses ou complexes ● Cela peut nécessiter de lancer une console ou d'interagir avec une file de messages © All rights reserved. Zend Technologies, Inc.
  • 12. Exposer des Web Services ● XML-RPC ● SOAP ● JSON-RPC ● AMF © All rights reserved. Zend Technologies, Inc.
  • 13. Comment utiliser le Zend Framework avec Symfony? © All rights reserved. Zend Technologies, Inc.
  • 14. Méthodes d'intégration ● Généralement, en installant un plugin ou en configurant le projet © All rights reserved. Zend Technologies, Inc.
  • 15. class ProjectConfiguration extends sfProjectConfiguration { static protected $zendAutoloader = false; static public function registerZend() { if (!self::$zendAutoloader) { set_include_path(implode( PATH_SEPARATOR, array( sfConfig::get('sf_lib_dir') . '/vendor', get_include_path(), ))) require_once 'Zend/Loader/Autoloader.php'; self::$zendAutoloader = Zend_Loader_Autoloader::getInstance(); } return self::$zendAutoloader } } © All rights reserved. Zend Technologies, Inc.
  • 16. Allons un peu plus loin ... class ProjectConfiguration extends sfProjectConfiguration { // ... // Autoload PEAR classes, too... static public function registerPear() { self::registerZend()->setFallbackAutoloader(); } } © All rights reserved. Zend Technologies, Inc.
  • 17. Utilisation des composants Zend : class readerReadTask extends sfBaseTask { // ... public function execute( $arguments = array(), $options = array() ) { // ... ProjectConfiguration::registerZend(); $feed = Zend_Feed_Reader::import($feed); // ... } } Il ne reste plus qu'à utiliser les classes! © All rights reserved. Zend Technologies, Inc.
  • 18. Quelques composants qui peuvent vous être utiles ... © All rights reserved. Zend Technologies, Inc.
  • 19. Les composants “service” (Zend_Service) ● Zend_Gdata ▶ Contacts, calendriers, and YouTube! ● Zend_Service_Amazon ▶ Recherche de livres, S3 & EC2, SQS (prochainement) ● Zend_Service_Akismet ▶ Détection de spams ● Et beaucoup, beaucoup d'autres ▶ http://framework.zend.com/manual/fr/zend.service.html © All rights reserved. Zend Technologies, Inc.
  • 20. Les outils de syndication (Zend_Feed) ● Zend_Feed_Reader – support complet pour consommer des flux, dont RSS (1 and 2) & Atom ● Zend_Feed_Writer – le “miroir” de Zend_Feed_Reader, destiné à rédiger des flux ● Zend_Feed_Pubsubhubbub – interaction avec les hubs PuSH, facilite la publication de flux et la souscription © All rights reserved. Zend Technologies, Inc.
  • 21. $feed = Zend_Feed_Reader::import($feedUri); $metadata = array( 'title' => $feed->getTitle(), 'description' => $feed->getDescription(), ); $entries = array(); foreach ($feed as $entry) { $entries[] = array( 'title' => $entry->getTitle(), 'link' => $entry->getLink(), 'timestamp' => $entry->getDateModified(), ); } © All rights reserved. Zend Technologies, Inc.
  • 22. $feed = new Zend_Feed_Writer_Feed; $feed->setTitle($someTitle) ->setLink($url) ->setDescription($description); $entry = $feed->createEntry(); $entry->setTitle($entryTitle) ->setLink($entryLink) ->setDateModified(time()); $feed->addEntry($entry); echo $feed->export('atom'); © All rights reserved. Zend Technologies, Inc.
  • 23. L'indexation avec Lucene ● Lucene est un format binaire optimisé pour l'indexation de documents et la recherche selon des critères complexes ● Zend_Search_Lucene traite les index au format Lucene ▶ Supporte la recherche et l'exploitation de données basée sur des index au format Lucene ▶ Supporte la generation d'index au format Lucene © All rights reserved. Zend Technologies, Inc.
  • 24. if (is_dir($indexDir)) { $index = Zend_Search_Lucene::open($indexDir); } else { $index = Zend_Search_Lucene::create($indexDir); } $doc = new Zend_Search_Lucene_Document(); $doc->addField(Zend_Search_Lucene_Field::Keyword( 'uri', $url)); $doc- >addField(Zend_Search_Lucene_Field::UnIndexed( 'timestamp', $ts)); $doc->addField(Zend_Search_Lucene_Field::Text( 'synopsis', $synopsis)); $doc->addField(Zend_Search_Lucene_Field::Unstored( 'content', $content)); $index->addDocument($doc); © All rights reserved. Zend Technologies, Inc.
  • 25. $hits = $index->find('+hello -dolly'); foreach ($hits as $hit) { printf('<a href="%s">%s ... (created %s)</a>', $hit->uri, $hit->synopsis, $hit->timestamp ); } © All rights reserved. Zend Technologies, Inc.
  • 26. Traitement des fichiers PDF ● PDF = une specification ouverte publiée par Adobe ● Zend_Pdf permet de : ▶ Manipuler et exploiter des fichiers PDF existants ▶ Créer de nouveaux fichiers PDF © All rights reserved. Zend Technologies, Inc.
  • 27. $pdf = Zend_Pdf::load($pdfFile); $page = $pdf->pages[0]; $font = Zend_Pdf_Font::fontWithName( Zend_Pdf_Font::FONT_HELVETICA ); $page->setFont($font, 36) ->setFillColor( Zend_Pdf_Color_Html::color('#CCC')) ->drawText('U R H2O-marked', 60, 500); $pdf->save($pdfFile); © All rights reserved. Zend Technologies, Inc.
  • 28. Sortons du cadre : Le cas des objets métiers © All rights reserved. Zend Technologies, Inc.
  • 29. Pour quelle raison ? ● Exécuter des tâches de traitement séparées et distinctes, sans recourir à l'artillerie lourde proposée par le framework ▶ Lorsqu'il est nécessaire de privilégier la vitesse d'exécution ▶ Lorsqu'il faut réduire au strict minimum les ressources utilisées ▶ Pour effectuer des traitements qui ne sont pas spécifiques à l'application Web (commandes en mode console, opérations en base de données, dialogue avec des web services, tâches périodiques, etc.) © All rights reserved. Zend Technologies, Inc.
  • 30. Autres raisons : ● Tester unitairement les objets métiers ▶ Les tests sur la base de données ne sont pas des tests unitaires ▶ Raison principale : rendre les batteries de tests moins complexes ● Réduire les dépendances ▶ Peut réduire la quantité de ressources utilisées ▶ Peut améliorer les performances (moins de bootstrapping et moins de ressources = code plus rapide) ● Utiliser les objets dans différents contextes © All rights reserved. Zend Technologies, Inc.
  • 31. Rôle des objets métiers ● Entities – souvent des “POPO” (Plain Old PHP Objects) ● Données agrégées ou Collections – d'entities ● Mappers – mapping entre les entities et les données persistantes, et vice-versa (essentiellement le rôle des ORM). Retournent des collections d'entities ou des données agrégées. ● Les objets de la couche Service – API publique de vos objets métiers ; ils utilisent d'autres objets du domaine et fournissent la logique métier © All rights reserved. Zend Technologies, Inc.
  • 32. La couche “Service” Data Access Objects and Data store(s) Data Mappers Entities Service Layer 32 © All rights reserved. Zend Technologies, Inc.
  • 33. Quelques conseils ● Les objets de la couche Service ne devraient retourner que des entités et/ou des données agrégées ● Pensez à retourner des objets Zend_Paginator ▶ Implémentant l'interface Countable ▶ Implémentant l'interface Iterable ▶ Les utilisateurs de la couche Service n'ont pas à savoir comment les données ont été retournées © All rights reserved. Zend Technologies, Inc.
  • 34. Autres conseils ● Implémenter la logique métier dans la couche Service ▶ Validation/Filtrage des données ▶ Interactions entre les entités ▶ Contrôles d'accès (ACLs) © All rights reserved. Zend Technologies, Inc.
  • 35. Retour dans le cadre : Les traitements asynchrones © All rights reserved. Zend Technologies, Inc.
  • 36. Les files d'attente (queues) ● Reporter à plus tard l'exécution d'un traitement ● Cas d'utilisation ▶ Envoyer un email ▶ Mettre à jour des index ▶ Interagir avec des API tierces (Salesforce, SugarCRM, etc) © All rights reserved. Zend Technologies, Inc.
  • 37. $queue = new Zend_Queue('MemcacheQ', array( 'name' => 'my-uber-queue', 'host' => 'queue.host.tld', )); $queue->send('Some message'); $messages = $queue->receive(5); echo count($queue), " messages registeredn"; foreach ($messages as $message) { // do something with message, // typically $message->body $queue->deleteMessage($message); }i © All rights reserved. Zend Technologies, Inc.
  • 38. Exposer des Web Services © All rights reserved. Zend Technologies, Inc.
  • 39. Objectifs d'un web service bien conçu ● S'auto-documenter ● Fournir des réponses rapides ● Etre lié aux objets de la couche Service © All rights reserved. Zend Technologies, Inc.
  • 40. Type de services fournis par ZF ● AMF (Active Message Format) - utilisé par Flex & Flash ● JSON-RPC - RPC utilisant JSON comme format de serialization ; clients en Dojo, YUI et ExtJS ● XML-RPC – protocole standard utilisé partout ● SOAP – service fourni avec l'auto-generation du WSDL et la serialization vers et à partir d'objets PHP © All rights reserved. Zend Technologies, Inc.
  • 41. Procédure élémentaire ● Tous les serveurs se conforment à l'API SoapServer de PHP ▶ Instanciation ▶ Ajout de classes et/ou de fonctions de callback ▶ Traitement de la requête © All rights reserved. Zend Technologies, Inc.
  • 42. $server = new Zend_XmlRpc_Server(); $server->setClass('My_Service_ApiClass', 'api'); echo $server->handle(); if ($_SERVER['REQUEST_METHOD'] == 'GET') { $server = new Zend_Soap_AutoDiscover(); } else { $server = new Zend_Soap_Server($thisScript); } $server->setClass('My_Service_ApiClass'); $server->handle(); © All rights reserved. Zend Technologies, Inc.
  • 43. Les objets de la couche Service sont rois ! ● Les méthodes publiques sont exposées par défaut ● Définissez votre API publique dans la couche Service, et réutilisez-la en fonction de vos besoins ▶ Les contrôles d'accès, la validation, etc., sont déjà définies et encapsulées © All rights reserved. Zend Technologies, Inc.
  • 44. Ressources Ajax ● Les requêtes AJAX doivent être rapides ▶ Pour les requêtes de type RPC, Zend_Json_Server est votre ami ▶ JSON-REST est de plus en plus populaire ; envisagez une solution RESTful MVC légère pour consommer vos objets Service, ou bien l'API REST de Symfony ● Une fois de plus, les objets de la couche Service sont vos amis © All rights reserved. Zend Technologies, Inc.
  • 45. Récapitulons © All rights reserved. Zend Technologies, Inc.
  • 46. Le Zend Framework fournit un large éventail de fonctionnalités utilisables dans vos applications Symfony. ● Pensez à bâtir un modèle métier riche et indépendant de l'application qui s'appuie sur des composants variés. ● Déportez les traitements chaque fois que vous le pouvez, et placez vos points d'entrée Service en dehors de l'application Web pour de meilleures performances. © All rights reserved. Zend Technologies, Inc.
  • 47. Ressources ● Le manuel de ZF : http://framework.zend.com/manual ● Ces diapositives sur Slideshare : http://slideshare.net/weierophinney ● http://slideshare.net/xgorse © All rights reserved. Zend Technologies, Inc.
  • 48. Merci de votre attention ! © All rights reserved. Zend Technologies, Inc.