Intégrer une librairie tierce
By Geoffrey on Wednesday 6 September 2006, 23:21 - Coding - Permalink
Il arrive forcément un moment dans un projet où le besoin de fonctionnalités avancées dans un domaine particulier (mail, réseau, etc) se fait sentir. En général, l'utilisation d'une librairie tierce s'avère nécessaire et pose quelques légers et irritants problèmes, particulièrement au niveau de la convention de nommage des classes et de l'arborescence des répertoires qui devient rapidement bordélique. Nos objectifs seront donc:
- Utiliser une librairie tierce
- Respecter la convention de nommage Zend
- Avoir un arborescence propre
Ça tombe bien, c'est très simple à réaliser :-)
Pour ce faire, il convient de prendre nos objectifs à rebours, commençons donc par l'arborescence. Nous allons classer nos librairies par site, ce qui est une méthode assez courante. Admettons que vous ayez une arborescence de base (plus de précisions sur l'arboresence basique dans un prochain article):
app/ library/ Zend/ Zend.php www/
Nous allons stocker nos librairies dans library/ext/, comme externe, et en fonction du domaine où on peut les trouver. Prenons le cas de l'excellent PHPMailer, qui est hébergé sur http://phpmailer.sourceforge.net/. Nous stockerons cette librairie dans library/ext/net/sourceforge/phpmailer/, ce qui résoud la problèmatique de l'arborescence.
Pour attaquer la 2ème problèmatique (convention de nommage), nous allons créer un nouveau répertoire dans library qui contiendra nos extensions au framework. Ce répertoire nous sera très utile par la suite. Nous l'appellerons ici Extensions, mais cela peut-être n'importe quel nom qui peut vous sembler approprié, Monappli par exemple. Une fois ce répertoire créé, nous pouvons passer aux choses sérieuses, et créer notre classe Extensions_Mailer dans library/Extensions/Mailer.php:
require_once dirname(__FILE__).'/../ext/net/sourceforge/phpmailer/class.phpmailer.php';
class Extensions_Mailer extends PHPMailer {
}
Et voilà, tous nos problèmes sont résolus. Notre classe est désormais reconnue par Zend::loadClass, ce qui finalement était bien le but de l'opération:
Zend::loadClass('Extensions_Mailer');
$mailer = new Extensions_Mailer;
L'objet $mailer est donc une instance de Extensions_Mailer, qui n'est finalement que la classe PHPMailer renommée ! Cela permet également au passage de surclasser PHPMailer pour y ajouter nos propres fonctions.