Archives de la catégorie ‘architecture’

 

Zend Framework 1.10 : un outil complet – 6. septembre, 2010

Il aura fallu attendre la version 1.10.x de Zend Framework pour disposer d’un outil « complet », notamment avec un composant Zend_Application plus mûr, une gestion plus fiable de l’auto-chargement et un Zend_Db utile permettant la mise en place de modèles de données sans ambiguïté. La documentation est intéressante et plutôt claire, bien que la traduction française pas toujours au fait de la dernière version en date et que l’utilisation avancée des composants nécessite toujours de se plonger dans le code.

Ceux qui ont commencé avec une version inférieure à 1.8 auront pour la plupart du mal à intégrer Zend_Application. Mais l’utilisation de ce dernier n’est pas nécessaire lorsque la base applicative est bonne. Je travaille encore sur des applications qui ont commencé avec Zend Framework 1.2 et qui aujourd’hui profitent sans problème des avancées de la 1.10. C’est en revanche côté migration de PHP 5.2 vers PHP 5.3 qu’il peut y avoir des problèmes : maintenir un PHP 5.2.x récent est conseillé tant que Zend Framework 1.x reste d’actualité.

Pour ceux qui débutent avec Zend Framework, l’application quick start est un bon moyen de commencer, suivi par le guide de référence. Zend_Tool est également un composant intéressant qui évolue et permet la mise en place rapide d’architectures applicatives.

Handlers utilisés pour la création de pluginsPour les utilisateurs avancés, créer et étendre des composants avec Zend Framework est aussi simple que confortable, ne serait-ce que pour agréger sa bibliothèque de validateurs, filtres, plugins et helpers, bien utiles d’une application à l’autre. L’implémentation MVC et son environnement sont également bien pensés : routage, boucle d’exécution, système d’intégration sous forme de plugins (cf. illustrations). Plugin qui enregistre des informations de débogage et les afficheLa connaissance approfondie des principaux composants de Zend Framework apporte incontestablement gain de temps et cohérence… pas plus tard que la semaine dernière, les 540 lignes de code d’un modèle de données n’en on fait plus que 4 (!), connaissance approximative de Zend_Db_Table oblige.

Côté performance, rien de révolutionnaire. Un accélérateur de type APC sera nécessaire et un bon système de fichiers aussi. Ces deux conditions étant remplies, les performances applicatives seront dans la plupart des cas tout à fait honorables, on aura du mal à croire qu’une bonne centaine d’inclusions en moyennes sont opérées à chaque requête HTTP.

Standard PHP Library : ArrayAccess – 17. février, 2009

La « librairie standard de PHP » ou SPL sont un ensemble de classes et d’interfaces qui permettent d’optimiser les performances et les pratiques de programmation en PHP. Cet outil, qui est installé par défaut dans PHP, mérite fortement d’être connu et permet des acrobaties très intéressantes, comme nous allons le voir.

Ce tout premier tutoriel aborde une classe courante de la SPL : ArrayAccess. Nous allons nous amuser à mettre en place un lien fort entre un flux XML et un tableau. Ce système permet d’écrire et de lire dans un fichier XML de manière très simple, à travers un tableau !

Lier un flux XML à un tableau

ArrayAccess est une interface qui permet de donner à une classe des propriétés que seuls les tableaux avaient jusqu’à présent. Le principe : on peut contrôler les actions qui sont faites sur une variable qui s’apparente à un tableau, en particulier ajouter, modifier et retirer des éléments.

En d’autres termes, nous souhaitons lire et écrire dans ce flux xml…


Best practices PHP
Zend Framework
Memento PHP

…à travers un tableau, comme ceci :

// Affichage d'un produit
echo $products['bpp'] . "\n";

// Ajout d'un produit
$products['xml'] = "Le XML facile";
echo $products['xml'] . "\n";

// Suppression d'un produit
unset($products['pa']);
echo $products['pa'] . "\n";

La classe ProductList

Commençons par écrire notre classe qui contient le mécanisme de liaison entre le flux et le tableau simulé :

class ProductList implements ArrayAccess
{
    private $products = null;

    public function __construct($feed)
    {
        $this->products = simplexml_load_string($feed);
    }

    public function offsetExists($offset)
    {
        $xpath = '/products/product[@id=\'' . $offset . '\']';
        $values = $this->products->xpath($xpath);
        return (boolean) count($values);
    }

    public function offsetGet($offset)
    {
        $xpath = '/products/product[@id=\'' . $offset . '\']';
        $values = $this->products->xpath($xpath);
        if (count($values)) {
            return (string) $values[0];
        }
        return null;
    }

    public function offsetSet($offset, $value)
    {
        $product = $this->products->addChild('product', $value);
        $product['id'] = $offset;
    }

    public function offsetUnset($offset)
    {
        $cpt = -1;
        $toDel = array();
        foreach ($this->products->product as $product) {
            $cpt++;
            if ($product['id'] == $offset) {
                $toDel[] = $cpt;
            }
        }
        foreach ($toDel as $id) {
            unset($this->products->product[$id]);
        }
    }

    public function getXml()
    {
        return $this->products->asXML();
    }
}

Cette classe, qui implémente l’interface ArrayAccess, charge un flux XML via son constructeur __construct(). Ce flux peut être récupéré grâce à la méthode getXml(). Les quatres méthodes intéressantes, qui sont imposées par l’interface ArrayAccess sont les suivantes :

  • offsetExists est automatiquement appelé lorsque PHP souhaite savoir si un élément $offset du tableau existe. Pour simuler cela, nous faisons une requête xpath sur le flux XML.
  • offsetGet récupère l’élément du tableau dont la clé est $offset.
  • offsetSet ajoute un élément au tableau. Faire cela avec simplexml est un jeu d’enfant.
  • offsetUnset retire un élément du tableau. L’algorithme proposé ici retire les éventuels doublons.

Ainsi, la création d’un nouveau objet ProductList peut s’utiliser comme un tableau, comme le monde la section suivante.

Utilisation de l’objet ArrayAccess

Voici un petit exemple d’utilisation de cet objet. Comme nous pouvons le voir, son maniement s’apparente à celui d’un tableau et pourtant, c’est un fichier XML qui est manipulé par dessous :

$feed = "

Best practices PHP
Zend Framework
Memento PHP

";

// Création d'un tableau attaché au flux XML
$products = new ProductList($feed);

// Affichage d'un produit
echo $products['bpp'] . "\n";

// Ajout d'un produit
$products['xml'] = "Le XML facile";
echo $products['xml'] . "\n";

// Suppression d'un produit
unset($products['mp']);
echo $products['mp'] . "\n";

// Extraction du flux XML modifié
echo $products->getXml();

Le flux généré par ce petit exemple est le suivant :


Best practices PHP
Zend Framework
Le XML facile

Ce petit tutoriel s’arrête ici. Nous irons un peu plus loin dans le prochain avec d’autres interfaces telles qu’Iterator et Countable.

Posté dans architecture, PHP, SPL