Utilisation de l'API Product Advertising d'Amazon dans Symfony 1.4 à l'aide du Zend Framework

J'ai ajouté quelques liens sponsorisés au blog venant d'Amazon. Ne voulant pas ajouter les liens à la main, j'utilise l'API Product Advertising mis à disposition par Amazon.  Il me semblait logique qu'une classe ou librairie existait déjà dans le monde PHP pour cet API. J'ai donc commencé par chercher du coté des plugins pour Symfony. Eh oui ce blog tourne sur Symfony. Malheureusement aucun résultat. J'ai donc regardé dans la longue liste des librairies fournis avec le Zend Framework et j'y ai trouvé mon bonheur avec les classes Zend_Service_Amazon et Zend_Service_Amazon_Item.

1. Intégration du Zend Framework dans Symfony

Contrairement à beaucoup, j'ai choisi de placer le Zend Framework dans un plugin ce qui facilitera l'intégration du ZF dans d'autre projet Symfony. La structure est assez simple un dossier config et un dossier vendor. Je ne met les sources de ZF dans un dossier lib car je ne veux pas que l'autoload de sf tente de les charger. Dans la classe de configuration du plugin j'ajouterai l'autoload du Zend Framework. Ma structure de fichier donne ça:

 
/-plugins
    |__ ulZFPlugin
            |__ config
                  |__ ulZFPluginConfiguration.class.php
            |__ vendor
                  |__ Zend

 

J'ai téléchargé la dernière version du Zend Framework et j'ai copié le dossier library/Zend dans le dossier vendor sur plugin.
L'API d'Amazon à évolué fin 2011 et il faut prendre la version 1.12 actuellement la RC3 du ZF pour que les classes prennent en compte les évolution de l'API.

2. Configuration de l'autoload

Dans la classe de configuration du plugin ulZFPluginConfiguration.class.php, il faut ajouter l'autoloader de Zend qui sera chargé au moment où Symfony chargera le plugin.

 
<?php
/**
 * Class de configuration du plugin ulZFPlugin
 * Ajoute l'autoloader de Zend
 *
 * @author ulrich
 *
 */
class ulZFPluginConfiguration extends sfPluginConfiguration
{
    protected static $zendAutoloader = false;
 
    /**
     * Creation de l'instance de l'autoloader de Zend
     *
     * @return Zend_Loader_Autoloader
     */
    public static function registerZend() {
 
        if (!self::$zendAutoloader) {
 
            set_include_path(implode(PATH_SEPARATOR, array(
            __DIR__ . '/../vendor',
            get_include_path()
            )));
 
            require_once('Zend/Loader/Autoloader.php');
            self::$zendAutoloader = Zend_Loader_Autoloader::getInstance();
        }
 
        return self::$zendAutoloader;
    }
 
    /**
     * Ajout de l'autoloader de Zend
     *
     * (non-PHPdoc)
     * @see sfPluginConfiguration::initialize()
     */
    public function initialize()
    {
        self::registerZend();
    }
}
 

Il ne faut pas oublier d'ajouter le plugin dans la classe config/ProjectConfiguration.class.php

 
public function setup()
{
     $this->enablePlugins(array( 'ulZFPlugin'));
}
 

3. Utilisation des classes de Zend

Il est maintenant possible d'utiliser n'importe quelle classe de Zend. La document du ZF n'est pas encore à jour, il faut absolument ajouter son Associate Tag dans les requetes faites au webservice.

 
$zsa = new Zend_Service_Amazon('MY_PUBLIC_KEY', 'FR', 'MY_PRIVATE_KEY');
$livres = $zsa->itemSearch(array(
    'AssociateTag' => 'MY_TAG',
    'SearchIndex' => 'Books',
    'Keywords' => 'PHP'
));
 
foreach ($livres as $livre) {
    echo $livre->Title.'<br/>';
}

Voici à mon goût une élégante façon  d'utiliser le meilleur des 2 principaux frameworks et de gagner du temps de développement.

Ajouter un commentaire