Utiliser le Zend Framework
avec Symfony
Xavier Gorse – ELAO

A partir du support de
Matthew Weier O'Phinney
Chef de Projet...
Xavier Gorse    - xavier.gorse@elao.com

●   Gérant de la société ELAO
●   Expertise, formation et
    développement d’app...
Matthew Weier O'Phinney
●   Développeur PHP
    depuis 2000
●   Contributeur du Zend
    Framework depuis
    2006
●   Che...
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.
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 peuv...
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'in...
Traitements asynchrones
●   Généralement : déporter certains traitements
    sur d'autres composants
       ▶   Files d'at...
Exposer des Web Services
●   XML-RPC
●   SOAP
●   JSON-RPC
●   AMF




                © All rights reserved. Zend Technol...
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




                    ©...
class ProjectConfiguration
    extends sfProjectConfiguration
{
    static protected $zendAutoloader = false;

    static ...
Allons un peu plus loin ...


class ProjectConfiguration
    extends sfProjectConfiguration
{
    // ...

    // Autoload ...
Utilisation des composants Zend :

  class readerReadTask extends sfBaseTask
  {
      // ...
      public function execut...
Quelques composants qui peuvent vous
           être utiles ...




             © All rights reserved. Zend Technologies,...
Les composants “service” (Zend_Service)
●   Zend_Gdata
       ▶   Contacts, calendriers, and YouTube!
●   Zend_Service_Ama...
Les outils de syndication (Zend_Feed)
●   Zend_Feed_Reader – support complet pour
    consommer des flux, dont RSS (1 and ...
$feed = Zend_Feed_Reader::import($feedUri);
$metadata = array(
    'title'       => $feed->getTitle(),
    'description' =...
$feed = new Zend_Feed_Writer_Feed;
$feed->setTitle($someTitle)
     ->setLink($url)
     ->setDescription($description);
$...
L'indexation avec Lucene
●   Lucene est un format binaire optimisé pour
    l'indexation de documents et la recherche
    ...
if (is_dir($indexDir)) {
    $index = Zend_Search_Lucene::open($indexDir);
} else {
    $index = Zend_Search_Lucene::creat...
$hits = $index->find('+hello -dolly');
foreach ($hits as $hit) {
    printf('<a href="%s">%s ... (created %s)</a>',
      ...
Traitement des fichiers PDF
●   PDF = une specification ouverte publiée par
    Adobe
●   Zend_Pdf permet de :
       ▶   ...
$pdf = Zend_Pdf::load($pdfFile);
$page = $pdf->pages[0];
$font = Zend_Pdf_Font::fontWithName(
    Zend_Pdf_Font::FONT_HELV...
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 lour...
Autres raisons :
●   Tester unitairement les objets métiers
       ▶   Les tests sur la base de données ne sont pas des
  ...
Rôle des objets métiers
●   Entities – souvent des “POPO” (Plain Old PHP
    Objects)
●   Données agrégées ou Collections ...
La couche “Service”


     Data Access Objects
     and Data store(s)


     Data Mappers

     Entities


     Service
  ...
Quelques conseils
●   Les objets de la couche Service ne devraient
    retourner que des entités et/ou des données
    agr...
Autres conseils
●   Implémenter la logique métier dans la couche
    Service
       ▶   Validation/Filtrage des données
  ...
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
       ▶   Env...
$queue = new Zend_Queue('MemcacheQ', array(
    'name' => 'my-uber-queue',
    'host' => 'queue.host.tld',
));
$queue->sen...
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...
Type de services fournis par ZF
●   AMF (Active Message Format) - utilisé par
    Flex & Flash
●   JSON-RPC - RPC utilisan...
Procédure élémentaire
●   Tous les serveurs se conforment à l'API
    SoapServer de PHP
       ▶   Instanciation
       ▶ ...
$server = new Zend_XmlRpc_Server();
$server->setClass('My_Service_ApiClass', 'api');
echo $server->handle();



  if ($_SE...
Les objets de la couche Service sont rois !
●   Les méthodes publiques sont exposées par
    défaut
●   Définissez votre A...
Ressources Ajax
●   Les requêtes AJAX doivent être rapides
       ▶   Pour les requêtes de type RPC,
             Zend_Jso...
Récapitulons




               © All rights reserved. Zend Technologies, Inc.
●   Le Zend Framework fournit un large éventail
    de fonctionnalités utilisables dans vos
    applications Symfony.
●   ...
Ressources
●   Le manuel de ZF :
    http://framework.zend.com/manual
●   Ces diapositives sur Slideshare :
    http://sli...
Merci de votre attention !




              © All rights reserved. Zend Technologies, Inc.
Upcoming SlideShare
Loading in...5
×

Utiliser le Zend Framework avec Symfony

7,039

Published on

Published in: Technology
1 Comment
0 Likes
Statistics
Notes
  • Be the first to like this

No Downloads
Views
Total Views
7,039
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
66
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide

Utiliser le Zend Framework avec Symfony

  1. 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. 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. 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. 4. Zend Framework : quelques rappels © All rights reserved. Zend Technologies, Inc.
  5. 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. 6. © All rights reserved. Zend Technologies, Inc.
  7. 7. Comparatif Symfony / Zend Framework © All rights reserved. Zend Technologies, Inc.
  8. 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. 9. Pourquoi utiliser ZF avec Symfony? © All rights reserved. Zend Technologies, Inc.
  10. 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. 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. 12. Exposer des Web Services ● XML-RPC ● SOAP ● JSON-RPC ● AMF © All rights reserved. Zend Technologies, Inc.
  13. 13. Comment utiliser le Zend Framework avec Symfony? © All rights reserved. Zend Technologies, Inc.
  14. 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. 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. 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. 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. 18. Quelques composants qui peuvent vous être utiles ... © All rights reserved. Zend Technologies, Inc.
  19. 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. 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. 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. 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. 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. 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. 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. 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. 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. 28. Sortons du cadre : Le cas des objets métiers © All rights reserved. Zend Technologies, Inc.
  29. 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. 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. 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. 32. La couche “Service” Data Access Objects and Data store(s) Data Mappers Entities Service Layer 32 © All rights reserved. Zend Technologies, Inc.
  33. 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. 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. 35. Retour dans le cadre : Les traitements asynchrones © All rights reserved. Zend Technologies, Inc.
  36. 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. 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. 38. Exposer des Web Services © All rights reserved. Zend Technologies, Inc.
  39. 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. 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. 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. 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. 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. 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. 45. Récapitulons © All rights reserved. Zend Technologies, Inc.
  46. 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. 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. 48. Merci de votre attention ! © 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.

×