Codeigniter : Créer Vos Bibliothèques
Nous allons expliquer comment créer vos propres classes dans votre dossier application/libraries afin de conserver la séparation entre vos ressources locales et les ressources globales du framework.
CodeIgniter vous permet d'ajouter des fonctionnalités à une classe existante en faisant hériter les votre de classes natives. Vous pouvez même remplacer certaines classes originales en nommant les votre de la même manière et en les plaçant dans votre dossier application/libraries.
En résumé :
- Vous pouvez créer entièrement de nouvelles bibliothèques/classes,
- Vous pouvez étendre les classes natives,
- Vous pouvez remplacer les bibliothèques/classes natives.
Cette page détaille ces 3 concepts.
Remarque : Les classes de base de données ne peuvent être ni héritées ni remplacées pas vos classes, de même que la classe Loader en PHP4. Toutes les autres peuvent être remplacées/héritées.
Stockage
Vos classes personnelles devraient être placées dans le dossier application/libraries. CodeIgniter les cherchera à cet endroit lors de leur initialisation .
Conventions de Noms
- Les noms des fichiers doivent commencer par une majuscule. Par exemple : Myclass.php,
- Les déclarations de classes doivent commencer par une majuscule. Par exemple : class Myclass,
- Les noms de classes et de fichiers doivent correspondre.
Le Fichier Classe
Les Classes devraient ressembler à ceci (Note: Someclass n'est qu'un exemple de classe) :
<?php
if ( ! defined('BASEPATH'))
exit('No direct script access allowed');
class Someclass {
function some_function()
{
}
}
?>
Utiliser Votre Classe
Pour chaque Contrôleur, vous pouvez initialiser votre classe de la manière suivante :
$this->load->library('someclass');
Où someclass est le nom du fichier php, sans l'extension '.php'. Vous pouvez utiliser le nom de fichier en minuscule ou majuscule. CodeIgniter ne fait pas la différence.
Une fois chargée, vous pouvez accéder aux méthodes de classes de la manière suivante :
$this->someclass->some_function();
// Les instances d'objet seront toujours en minuscule
Passer des Paramètres à l'Initialisation de Votre Classe
Dans la fonction de chargement de la bibliothèque, vous pouvez passer des données dynamiquement, par un tableau via le deuxième paramètre, dans le constructeur de classe :
$params = array(
'type' => 'large',
'color' => 'red'
);
$this->load->library('Someclass', $params);
Si vous utilisez cette fonctionalité, il faut prévenir le constructeur en lui précisant les données à recevoir :
<?php
if ( ! defined('BASEPATH'))
exit('No direct script access allowed');
class Someclass {
function Someclass($params)
{
// Do something with $params
}
}
?>
Vous pouvez aussi passer des paramètres stockés dans un fichier de configuration. Créez un fichier de configuration ayant le même nom que votre fichier de classe et sauvegardez-le dans votre dossier application/config/.
Notez que si vous passez dynamiquement vos paramètres comme ci-dessus, le fichier de configuration ne sera pas disponible.
Utiliser les Ressources de CodeIgniter dans vos Bibliothèques
Pour accéder aux ressources natives de CodeIgniter dans vos classes, utilisez la fonction get_instance(). Cette fonction retourne le super-objet CodeIgniter.
Vous pouvez normalement appeler, dans vos fonctions contrôleur, toutes les fonctions de CodeIgniter disponibles grâce à la structure $this :
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc...
Néanmoins, $this ne marche que dans vos contrôleurs, vos modèles, ou vos vues. Pour utiliser les classes de CodeIgniter dans vos propres classes, faite comme ce qui suit :
D'abord, assignez l'objet CodeIgniter à une variable :
$CI =& get_instance();
Une fois l'objet assigné à une variable, vous pouvez utiliser cette variable à la place de $this:
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc.
Remarque : Vous noterez que la fonction get_instance() est passée par référence :
$CI =& get_instance();
C'est très important.Assigner par référence vous permet d'utiliser l'objet CodeIgniter original au lieu d'en créer une copie.
De plus, veuillez notez que si vous utilisez PHP 4, il est préférable d'éviter d'appeler get_instance()
dans votre constructeur de classe. PHP 4 a des difficultés pour référencer le super objet CI, dans le constructeur de l'application.
En effet, les objets ne peuvent exister que lorsque la classe est complètement instanciée.
Remplacer les Bibliothèques Natives par Vos Versions
En nommant vos fichiers de classes de la même manière que ceux de la bibliothèque native vous permettez à CodeIgniter de les remplacer par les vôtres. Pour utiliser cette fonctionnalité, les noms du fichier et la classe doivent être les même que ceux de la bibliothèque native. Par exemple, si vous voulez remplacer la bibliothèque native Email, vous créerez un fichier nommé application/libraries/Email.php et devrez déclarer votre classe avec :
class CI_Email {
}
Notez que la majorité des classes natives sont préfixées de CI_.
Pour charger votre bibliothèque, il suffit d'utiliser la fonction de chargement standard :
$this->load->library('email');
Reamrque : A l'heure actuelle, les classes Database ne peuvent pas être remplacées par vos propres versions.
Hériter des Classes Natives
Si vous avez besoin d'ajouter quelques fonctionnalités à une bibliothèque existante (une fonction ou deux), il est inutile de remplacer la bibliothèque entière avec votre version. Dans ce cas, il est préférable d'étendre la classe. Étendre une classe se fait de la même façon qu'un remplacement à part que :
- La déclaration de classe doit hériter de la classe parent,
- Votre nouvelle classe et nom de fichier doivent être préfixés de MY_ (ce préfixe est configurable. Voir ci dessous.).
Par exemple, pour hériter de la classe native Email vous créerez un fichier nommé application/libraries/MY_Email.php, et déclarerez votre classe avec :
class MY_Email extends CI_Email {
}
Remarque : Si vous avez besoin d'un constructeur dans votre classe, vérifiez que vous héritez du constructeur parent :
class MY_Email extends CI_Email {
function My_Email()
{
parent::CI_Email();
}
}
Charger Vos Classes Enfants
Pour charger votre classe enfant, utilisez la syntaxe standard. N'INCLUEZ PAS vos préfixes. Par exemple, pour charger l'exemple ci-dessus, qui hérite de la classe Email :
$this->load->library('email');
Une fois chargée, utilisez la variable de classe comme une variable de classe normale. Dans le cas de la classe email, tous les appels se feront de la manière suivante :
$this->email->some_function();
Créer vos Propres Préfixes
Pour créer vos propres préfixes de classe enfant, ouvrez le fichier application/config/config.php et cherchez la ligne :
$config['subclass_prefix'] = 'MY_';
Veuillez noter que toutes les classes natives de CodeIgniter sont préfixées de CI_ donc N'UTILISEZ PAS ce préfixe.