Co­deIg­ni­ter est un framework d'ap­pli­ca­tion Web pour les dé­ve­lop­peurs qui préfèrent la vitesse à un grand choix de fonctions. Selon la page of­fi­cielle de Co­deIg­ni­ter, l'ob­jec­tif principal du framework PHP open-source est d'offrir un maximum de per­for­mance et de flexi­bi­lité dans une structure de pro­gram­ma­tion la plus simple possible.

Co­deIg­ni­ter : qu’est-ce que c’est ?

Co­deIg­ni­ter est un framework Web écrit en PHP, qui vante une con­cep­tion lo­gi­cielle compacte rendant le dé­ve­lop­pe­ment d'ap­pli­ca­tions Web plus rapide et plus efficace. Co­deIg­ni­ter a été créé par la société amé­ri­caine de logiciels EllisLab, qui a publié sa première version en février 2006. Le 9 juillet 2013, EllisLab annonce qu'elle n’est plus en mesure de réunir seule les res­sources né­ces­saires pour pour­suivre le dé­ve­lop­pe­ment du logiciel. Un an plus tard, le projet est donc repris par le British Columbia Institute of Tech­no­logy (BCIT). Le code source du framework est sous licence MIT et peut être obtenu à partir du service en ligne GitHub. La dernière version stable, Co­deIg­ni­ter 3.1.2, est dis­po­nible en té­lé­char­ge­ment gratuit sur la page of­fi­cielle du projet depuis octobre 2016.

Cons­truc­tion et structure du framework

La con­cep­tion orientée per­for­mance de Co­deIg­ni­ter se reflète dans la cons­truc­tion allégée du framework PHP. Elle est basée sur le modèle d'ar­chi­tec­ture lo­gi­cielle appelé Modèle-Vue-Con­trô­leur (MVC). Le principe fon­da­men­tal du MVC est la sé­pa­ra­tion stricte du code du programme et de la pré­sen­ta­tion. Elle est réalisée par une structure lo­gi­cielle modulaire et l'ex­ter­na­li­sa­tion du code PHP. On dif­fé­ren­cie alors trois com­po­sants centraux : le modèle de données (modèle), la pré­sen­ta­tion (vue) et le con­trô­leur.

  • Le modèle re­pré­sente la structure de données d'une ap­pli­ca­tion Web dé­ve­lop­pée sur la base de Co­deIg­ni­ter. Pour cela, des classes de modèles sont définies dans le code source. Il s'agit notamment de fonctions spéciales qui per­met­tent d'ex­traire des in­for­ma­tions d'une base de données, de les stocker ou de les mettre à jour.
  • La vue est la partie de l’ap­pli­ca­tion qui est présentée à l'uti­li­sa­teur final. Il s'agit en principe d'un document HTML dans lequel le contenu est intégré dy­na­mi­que­ment via PHP. Une vue est donc en quelque sorte com­pa­rable à un template. Co­deIg­ni­ter offre également la pos­si­bi­lité de définir en tant que vue des fragments de page Web tels que les en-têtes et pieds de page, ou encore des pages RSS. En règle générale, les ap­pli­ca­tions Web utilisent plusieurs vues qui tirent leur contenu du même modèle de données. Ceci permet de présenter les dif­fé­rentes ca­rac­té­ris­tiques du programme dans dif­fé­rentes vues.
  • Le con­trô­leur sert d'ins­tance de médiation entre le modèle, la vue et toute autre ressource né­ces­saire au trai­te­ment d'une requête HTTP ou à la création dynamique d'une page Web. Ce composant accepte les requêtes entrantes, valide les entrées, recherche la vue souhaitée et lui transmet les contenus que le modèle de données a chargé d'une base de données.

Le graphique suivant montre de manière sché­ma­ti­sée comment les com­po­sants MVC in­te­ra­gis­sent :

La structure MVC permet une con­cep­tion lo­gi­cielle flexible, dans laquelle les modules de programme peuvent tous être échangés, révisés et réu­ti­li­sés en un minimum d'efforts. Les mo­di­fi­ca­tions apportées à un composant n'ont en principe pas d'effet sur le code source des autres com­po­sants (à condition qu'aucune mo­di­fi­ca­tion ne soit apportée aux in­ter­faces).

La sé­pa­ra­tion stricte entre la logique et la pré­sen­ta­tion du programme garantit un code de pro­gram­ma­tion clair et bien structuré. La main­te­nance des ap­pli­ca­tions Web basées sur MVC est nor­ma­le­ment assez simple. En cas d'erreur, la recherche du dys­fonc­tion­ne­ment se limite dans la plupart des cas à l’un des com­po­sants.

Par ailleurs, le modèle d'ar­chi­tec­ture MVC offre la pos­si­bi­lité de dé­ve­lop­per de manière séparée la logique et la mise en page d'une ap­pli­ca­tion web. Si les dé­ve­lop­peurs back-end et front-end tra­vail­lent en parallèle, les ap­pli­ca­tions peuvent être com­plé­tées beaucoup plus ra­pi­de­ment.

Co­deIg­ni­ter utilise MVC, mais ne lie pas com­plè­te­ment les uti­li­sa­teurs à ce modèle ar­chi­tec­tu­ral. Si Con­trô­leur et Vue cons­ti­tuent des com­po­sants obli­ga­toires, les con­nexions aux bases de données via le modèle sont quant à elles fa­cul­ta­tives. De plus, une ap­pli­ca­tion basée sur Co­deIg­ni­ter peut également être im­plé­men­tée avec une ar­chi­tec­ture MVC hié­rar­chique (HMVC) qui étend le modèle classique MVC à une logique hié­rar­chique.

Flux d'ap­pli­ca­tion du framework PHP

Co­deIg­ni­ter est basé sur un concept d'URL. Cela signifie que le con­trô­leur en tant qu'unité centrale de commande entre la vue et le modèle est sollicité en entrant une URL dans la barre de recherche du na­vi­ga­teur Web. Les dé­ve­lop­peurs créent à cette fin des classes con­trô­leurs. Il s'agit de fichiers PHP qui con­tien­nent diverses fonctions pour charger des bi­blio­thèques (libraries), des ex­ten­sions (plugins) ou des classes d'aide (helper), pour se connecter à des bases de données, pour intégrer des modèles de données, ou encore pour re­cher­cher une vue spé­ci­fique.

Le flux d'ap­pli­ca­tion de Co­deIg­ni­ter est ainsi basé sur le schéma URL de base suivant :

exemple.com/class/function/parameter

Le nom de domaine (exemple.com) est suivi d'une classe con­trô­leur à adresser et d'une fonction de con­trô­leur spé­ci­fique. Les pa­ra­mètres op­tion­nels terminent le schéma. Ces derniers servent à trans­mettre les ID ou variables au con­trô­leur sé­lec­tionné.

En pratique, une URL Co­deIg­ni­ter pourra res­sem­bler à ceci :

exemple.com/news/article/511

Une telle URL s’adresse au con­trô­leur news sur le nom de domaine exemple.com et l'amène à exécuter la fonction article (par exemple, pour charger une vue du même nom pour la vi­sua­li­sa­tion de l’article). Les pa­ra­mètres op­tion­nels qui sont transmis au con­trô­leur avec l'URL spé­ci­fient quels contenus doivent être récupérés de la base de données via le modèle de données - dans cet exemple, un article avec ID 511.

Dans la con­fi­gu­ra­tion de sortie, Co­deIg­ni­ter comprend index.php dans chaque URL d'ap­pli­ca­tion :

exemple.com/index.php/news/article/511

Ce fichier PHP contient des in­for­ma­tions sur l'em­pla­ce­ment des fichiers de base du framework ainsi que les bi­blio­thèques, ex­ten­sions ou classes d'aide associées, et indique dans quel ré­per­toire se trouvent les fichiers de l'ap­pli­ca­tion. index.php est utilisé pour ini­tia­li­ser toutes les res­sources de base.

Si Co­deIg­ni­ter s'exécute sur un serveur Apache HTTP, index.php peut être supprimé des URL de l'ap­pli­ca­tion via mod_rewrite, de sorte que les uti­li­sa­teurs et crawlers des moteurs de recherche puissent disposer d’adresses Web « propres ». Les dé­ve­lop­peurs ajoutent alors au fichier .htaccess du serveur Web le bloc de code suivant:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

La structure de base du framework PHP est basée prin­ci­pa­le­ment sur les classes con­trô­leurs, les classes de modèles et les templates de vues.

Classes con­trô­leur

Co­deIg­ni­ter offre aux dé­ve­lop­peurs la pos­si­bi­lité de pro­gram­mer des con­trô­leurs in­di­vi­duels en tant que classes per­son­na­li­sées. Pour ce faire, les dé­ve­lop­peurs Web disposent d’un fichier PHP distinct pour chaque con­trô­leur dans le ré­per­toire ap­pli­ca­tion/con­trol­lers/. Les con­trô­leurs con­tien­nent la logique de programme d'une ap­pli­ca­tion Web dé­ve­lop­pée avec Co­deIg­ni­ter et sont créés en tant que sous-classes de CI_Con­trol­ler class. Les pro­gram­meurs y procèdent en utilisant dans le code source le mot-clé extends.

class News extends CI_Controller {
}

En tant que classe enfant, News hérite de la part de la classe parent CI_Con­trol­ler de toutes les fonctions sur la vi­si­bi­lité public et protected.

Remarque

Les mots-clés public, protected ou private sont utilisés en PHP pour définir la vi­si­bi­lité d'une propriété ou d'une fonction. Si un élément est déclaré public, toutes les classes d'un logiciel vont avoir accès à l'élément. Pour res­treindre cet accès aux classes parents et aux classes dérivées, les pro­gram­meurs utilisent le mot-clé protected. Un élément déclaré comme privé (private) n'est dis­po­nible que pour la classe qui définit l'élément.

Chaque classe con­trô­leur per­son­na­li­sée doit également inclure une fonction cons­truc­tion qui permet d'in­té­grer des bi­blio­thèques, un modèle de données, des bases de données ou des classes d'aide. A partir de PHP5, __construct() est utilisé comme une fonction cons­truc­teur stan­dar­di­sée.

<?php
class News extends CI_Controller {
    public function __construct() {        //définit le constructeur 
        parent::__construct();        //récupère le constructeur de la classe parent
        $this->load->helper('url');        // charge une classe helper pour travailler avec les URL
        $this->load->helper('file');        //charge une classe helper pour travailler avec les fichiers 
        $this->load->database();        //charge une base de données
        $this->load->model('News_model');    //charge un modèle du nom « News_model » 
}
?>

L'exemple présente la classe News comme sous-classe de CI_Con­trol­ler. La fonction cons­truc­teur __construct() intègre deux classes « helper », une base de données et le modèle de données News_model. Les dif­fé­rentes lignes de code sont com­men­tées dans le code source.

Note

Toutes les classes con­trô­leurs définies en PHP pour Co­deIg­ni­ter doivent commencer par une lettre majuscule (News et non news). Dans l'URL, on utilise en revanche les lettres mi­nus­cules.

Fonction Con­trô­leur

Si la structure de base du con­trô­leur per­son­na­lisé est définie, la logique de pro­gram­ma­tion pro­pre­ment dite va suivre sous la forme de fonctions con­trô­leur, per­met­tant par exemple d’appeler les vues ou encore d’établir des in­te­rac­tions avec un modèle de données.

Pour permettre au con­trô­leur de charger une vue, le document HTML sous-jacent doit être stocké en tant que fichier PHP dans le ré­per­toire ap­pli­ca­tion/views/. Une vue simple pourrait ainsi res­sem­bler à ceci pour une vi­sua­li­sa­tion d'article :

<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="utf-8">
    <title><?php echo $title; ?></title>
 </head>
 <body >
    <h1><?php echo $headline ?></h1>
    <p><?php echo  $content_body ?></p>
 </body>
</html>
Remarque

les documents HTML contenant du code PHP doivent être sau­ve­gar­dés sous forme de fichiers PHP (.php). C'est la seule façon de s'assurer que l'in­ter­pré­teur PHP du serveur Web exécute les scripts et ne se contente pas de sortir le code PHP sous forme de texte.

Pour charger une vue dans le con­trô­leur, il est né­ces­saire que l’uti­li­sa­teur définisse une fonction. L'exemple de code suivant utilise la fonction article() pour charger la vue article.php.

public function article() {
    if (!file_exists(application/views/article.php)) {
        show_404();
    }
$this->load->view('article');
}

Le code du programme se lit comme suit : tout d’abord, Co­deIg­ni­ter vérifie si le ré­per­toire ap­pli­ca­tion/views/ contient un fichier nommé article.php. Cette requête est réalisée grâce à if et à la condition négative (!file-exists().

Si la condition est vraie et qu'il n'existe pas de fichier du même nom dans le ré­per­toire cor­res­pon­dant, if renvoie la valeur TRUE, et Co­deIg­ni­ter exécute la fonction show_404() listée sous if. Dans ce cas, l'uti­li­sa­teur sera informé que le fichier demandé n'existe pas. Si la condition if n'est pas remplie et que !file_exists est donné FAUX (false), Co­deIg­ni­ter exécute la fonction $this->load->view('article'). Cette dernière permet de charger le fichier cor­res­pon­dant pour la vue de l'ap­pli­ca­tion.

A partir du moment où l’on a un format PHP, le fichier désiré peut être énuméré dans la fonction view() sans suffixe. Si d'autres formats doivent être chargés, les suffixes de fichiers cor­res­pon­dants sont obli­ga­toires.

Co­deIg­ni­ter est gé­né­ra­le­ment utilisé dans les ap­pli­ca­tions Web dy­na­miques. Les uti­li­sa­teurs se voient alors afficher des pages Web générées dy­na­mi­que­ment et non des pages HTML statiques.

exemple.com/news/article/511

Jusqu’ici, seule une vue a été chargée pour l'af­fi­chage de l’article grâce à la fonction $this->load->view('article'). Il est main­te­nant né­ces­saire d'in­té­grer les contenus liés au paramètre 511. Nous partons du principe qu'il s'agit d'un ID lié à un article donné du système de gestion de base de données. Pour le charger à partir de la base de données dans le programme, l'exemple ci-dessus doit être complété de manière à ce que le modèle de données inclus dans le cons­truc­teur soit pris en compte.

public function article($id) {
    if (!file_exists(application/views/article.php)) {
        show_404();
    }
    $data = $this->News_model->get_data($id);
    $this->load->view('article', $data);}

L'ar­gu­ment de fonction donné (ici sous le nom de la variable $id) cor­res­pond à l’ID de l'URL - par exemple, 511. La fonction modèle get_data(), qui doit encore être écrite, est utilisée pour charger le contenu de l'article associé à l'ID de la base de données. La méthode view() appelle article-View et lui transmet ses données ($data). Le modèle de données News_model transfère donc les données lues au Con­trol­ler News, qui les transmet à la vue (view).

Toutes les opé­ra­tions associées à la ré­cu­pé­ra­tion des données sont trans­fé­rées vers le modèle de données intégré.

Classes de modèles

Les modèles de données sont utilisés par Co­deIg­ni­ter pour fournir des fonctions per­met­tant d'exé­cu­ter certaines opé­ra­tions de base de données. Tout comme les classes con­trô­leurs, les classes de modèles peuvent également être pro­gram­mées avec le framework PHP.

Pour créer une classe de modèle, un nom de classe est d'abord attribué, à savoir ici News_model. Comme pour les classes con­trô­leurs, toutes les classes de modèle définies par l'uti­li­sa­teur sont des sous-classes de la classe parent CI_Model. Le lien est établi par le mot-clé extends. Les classes de modèles intègrent également des bases de données et d'autres res­sources via la fonction cons­truc­teur.

class News_model extends CI_Model {
    public function __construct() {
        parent::__construct();
        $this->load->database(); 
    }
}

Sur cette structure de base, on trouve ce que l'on appelle des fonctions de modèle, dans les­quelles les dé­ve­lop­peurs dé­fi­nis­sent toutes les opé­ra­tions de base de données qui doivent être ac­ces­sibles au con­trô­leur par le modèle de données cor­res­pon­dant.

Fonctions de modèle

Les classes de modèles per­met­tent aux dé­ve­lop­peurs de définir des fonctions in­di­vi­duelles pour les opé­ra­tions de base de données. Dans un exemple précédent, nous avons utilisé dans la classe con­trô­leur News la fonction get_data() définie par l'uti­li­sa­teur pour charger le contenu de l'article de la base de données dans la vue. Dans le modèle, nous dé­fi­nis­sons main­te­nant quelles opé­ra­tions de la base de données sont cachées derrière cette fonction.

class News_model extends CI_Model {
    public function __construct() {
        parent::__construct();
        $this->load->database(); 
    }
public function get_data($id) {
     $this->db->select('content');
     $this->db->from('example_table');
     $this->db->where('id', $id);
    $query = $this->db->get();
    return $query->result();
}

Dans la classe de modèle News_model, la fonction get_data() utilisée ci-dessus est définie comme opération de la base de données qui interroge via get() la colonne de l'en­re­gis­tre­ment spécifié dans select() avec le numéro d'ID donné ($id) de la table de base de données spécifiée sous from() et la retourne sous forme de tableau en utilisant la fonction result(). Un modèle de données offre gé­né­ra­le­ment un large choix de fonctions de modèle. Les dé­ve­lop­peurs peuvent ainsi utiliser la classe Query Builder, qui regroupe un certain nombre de fonctions pré­dé­fi­nies pour les opé­ra­tions clas­siques de la base de données. Vous pourrez en savoir plus dans la do­cu­men­ta­tion of­fi­cielle du framework Co­deIg­ni­ter.

Routage avec Co­deIg­ni­ter

La classe et la fonction du con­trô­leur à adresser sont spé­ci­fiées par Co­deIg­ni­ter avec l’URL. Le framework Web utilise ainsi la structure d’URL classe/fonctions/pa­ra­mètres. Ce schéma de base peut être adapté selon les besoins. Co­deIg­ni­ter met par con­sé­quent à dis­po­si­tion le fichier routes.php dans le ré­per­toire ap­pli­ca­tion/config/. Il contient un tableau appelé $route, qui permet aux dé­ve­lop­peurs de définir leurs propres critères de routage.

Dans la con­fi­gu­ra­tion de sortie, trois entrées sont définies par défaut dans $route : le con­trô­leur standard, une règle de routage pour la re­di­rec­tion 404 et une règle pour remplacer au­to­ma­ti­que­ment les traits d'union (-) par des tirets bas (_).

$route['default_controller'] = 'home/welcome';
$route['404_override'] = 'home/welcome';
$route['translate_uri_dashes'] = FALSE;

La première entrée détermine le con­trô­leur par défaut de l'ap­pli­ca­tion. Ce dernier sera chargé par Co­deIg­ni­ter à chaque fois qu'une URL ne contient pas d’in­for­ma­tion sur le routage, hormis le domaine. Dans l'exemple ci-dessus, la règle de routage définit la classe de con­trô­leur home comme con­trô­leur par défaut. Les visiteurs qui ne procurent aucune in­for­ma­tion dans l’URL sur la page Web cible seront redirigés vers home et recevront la vue welcome. Gé­né­ra­le­ment, une re­di­rec­tion vers la page d'accueil est opérée. Si aucun con­trô­leur n'a été défini par défaut, Co­deIg­ni­ter affiche une page d'erreur 404 lorsque la page d'accueil est chargée.

La deuxième entrée par défaut dans $route définit un con­trô­leur qui est appelé chaque fois que le con­trô­leur adressé par l'URL n'est pas trouvé dans les fichiers de l'ap­pli­ca­tion. La règle de routage $route['404_override'] = 'home' écrase la page d'erreur 404 qui est nor­ma­le­ment affichée dans ce cas et redirige à la place vers home de la classe con­trô­leur.

La troisième entrée par défaut de $route empêche les erreurs de routage dues aux traits d'union. Le tiret n'est pas un caractère valide pour les noms de classes ou de fonctions. Les pa­ra­mètres par défaut le modifie donc au­to­ma­ti­que­ment dans les URL.

Si une règle de routage définie par l'uti­li­sa­teur doit être créée pour une URL dynamique, deux options se pré­sen­tent aux dé­ve­lop­peurs avec Co­deIg­ni­ter : les entrées de routage pour les URL dy­na­miques peuvent être définies grâce à des wildcards (mé­ta­ca­rac­tères) ou des ex­pres­sions ré­gu­lières.

routes.php prend en charge deux types de mé­ta­ca­rac­tère :

Note

Les sites Web contenant un grand nombre de pages d'erreur 404 sont dif­fi­ciles à parcourir et ne fa­ci­li­tent pas l’accès des moteurs de recherche vers les contenus per­ti­nents. Cela peut avoir une influence négative sur votre ré­fé­ren­ce­ment naturel, mais aussi un mauvais impact sur l'ex­pé­rience uti­li­sa­teur. En règle générale, les dé­ve­lop­peurs Web s’efforcent donc autant que possible d'éviter les pages d'erreur 404.

Wildcards of routes.php Des­crip­tion
:num Mé­ta­ca­rac­tère pour les nombre entier (Integer)
:any Mé­ta­ca­rac­tère pour une chaîne de caractère (String)

L'exemple suivant montre une entrée dans routes.php qui permet de supprimer la fonction (article) de l'URL :

$route['news/article/(:num)'] = 'news/$1';

Le paramètre d'une URL dynamique va lire le mé­ta­ca­rac­tère :num et le stocker dans la variable $1. Si vous dé­fi­nis­sez des règles de routage avec :num ou :any, vous devrez les mettre entre pa­ren­thèses dans routes.php.

routes.php accepte également les règles de routage sous forme d'ex­pres­sions. Les deux ca­rac­tères de rem­pla­ce­ment vus ci-dessus peuvent ainsi être également notés comme suit :

num correspond à \d+
:any correspond à [^/]+

Une al­ter­na­tive à l'exemple ci-dessus serait la notation suivante :

$route['news/article/(\d+ )'] = 'news/$1';

Les ex­pres­sions ré­gu­lières né­ces­si­tent également des pa­ren­thèses dans routes.php.

Aperçu du flux d'ap­pli­ca­tion

Le graphique suivant résume les flux d'une ap­pli­ca­tion basée sur Co­deIg­ni­ter en sept étapes :

  1. index.php fait figure de front con­trol­ler pour les requêtes HTTP entrantes de Co­deIg­ni­ter. Toutes les res­sources de base né­ces­saires à l'exé­cu­tion de l'ap­pli­ca­tion sont ini­tia­li­sées.

  2. Dans le cadre du routage (routing), Co­deIg­ni­ter vérifie quelle action doit être exécutée. Pour ce faire, l'ap­pli­ca­tion compare l'URL de la requête avec les règles de routage définies dans routes.php.

  3. La mise en cache fait suite au routage. Si une réponse cor­res­pon­dant à la requête se trouve dans le cache de l'ap­pli­ca­tion, elle est di­rec­te­ment envoyée au na­vi­ga­teur Web qui a établi la demande. Sinon, le con­trô­leur déterminé lors du routage est exécuté avec une fonction de filtrage en amont.

  4. Le framework Co­deIg­ni­ter contient un filtre intégré qui in­ter­cepte les requêtes mal­veil­lantes. Avant que l'ap­pli­ca­tion ne charge un con­trô­leur cor­res­pon­dant à une requête, chaque requête HTTP fait l'objet d'un contrôle de sécurité.

  5. Si la requête passe le filtre, le con­trô­leur est exécuté. Ce dernier sé­lec­tionne une vue ap­pro­priée et charge le modèle de données ainsi que toutes les bi­blio­thèques, classes « helper », ex­ten­sions et scripts qui sont né­ces­saires pour répondre à la requête.

  6. Dès que toutes les données per­ti­nentes ont été trans­fé­rées à la vue (view), elles peuvent être trans­mises au na­vi­ga­teur Web.

  7. Si la mise en cache est activée, Co­deIg­ni­ter conserve tem­po­rai­re­ment les données sortantes afin de pouvoir répondre di­rec­te­ment aux requêtes ré­pé­ti­tives.

Avantages des fra­me­works Co­deIg­ni­ter

Avec plus de 13 000 étoiles, Co­deIg­ni­ter est un projet de dé­ve­lop­pe­ment GitHub très apprécié se classant au troisième rang des fra­me­works PHP les plus po­pu­laires. Mais comme tout logiciel, Co­deIg­ni­ter présente à la fois des avantages et des in­con­vé­nients. Il est donc important de peser le pour et le contre avant de se décider d’opter pour le framework PHP. Voici les avantages de l'ap­pli­ca­tion :

  • Peu de con­fi­gu­ra­tions né­ces­saires : Co­deIg­ni­ter permet un démarrage rapide. Les uti­li­sa­teurs n'ont pas besoin de s’attarder longtemps sur les con­fi­gu­ra­tions, mais peuvent commencer à dé­ve­lop­per l'ap­pli­ca­tion souhaitée presque im­mé­dia­te­ment après l'ins­tal­la­tion du framework. La con­fi­gu­ra­tion est es­sen­tiel­le­ment limitée aux pa­ra­mètres de config.php dans le ré­per­toire ap­pli­ca­tion/config/. Les uti­li­sa­teurs dé­fi­nis­sent un chemin d'accès par défaut pour les na­vi­ga­teurs Web, une clé de cryptage, un nom pour le cookie de session et des pa­ra­mètres pour le cross-site scripting (XSS). Il est également re­com­mandé de créer un fichier .htaccess pour supprimer le fichier index.php du chemin URL de l'ap­pli­ca­tion via Re­wri­te­Rule. En outre, une con­fi­gu­ra­tion pour se connecter à la base de données est né­ces­saire, ce que vous pourrez spécifier dans le fichier database.php.
  • Em­preintes peu visibles : Co­deIg­ni­ter ne laisse que peu de traces dans le système. Le package de té­lé­char­ge­ment du framework re­pré­sente environ 11 Mo. Plus de 9 Mo sont toutefois dus à la do­cu­men­ta­tion détaillée du logiciel. La faible quantité de code est due au fait que le système de base Co­deIg­ni­ter ne contient que quelques petites bi­blio­thèques. Des res­sources sup­plé­men­taires peuvent être chargées au besoin.
     
  • Très bonne per­for­mance : le système de base léger permet de procurer une bonne vitesse à Co­deIg­ni­ter par rapport à d'autres fra­me­works PHP. Nombreux sont ceux qui en ont fait l’éloge, parmi lesquels Rasmus Lerdorf, l'in­ven­teur de PHP. Ce dernier annonça en 2008 lors de la con­fé­rence Free and Open Source (FrOSCon) qu'il ap­pré­ciait Co­deIg­ni­ter car il était plus rapide, plus léger et se dif­fé­ren­ciait des fra­me­works courants (« because it is faster, lighter and the least like a framework »).
     
  • URL « propres » : Co­deIg­ni­ter génère au­to­ma­ti­que­ment des URL bien adaptés pour les moteurs de recherche. Au lieu d'uti­li­ser des chaînes de requêtes pour accéder au contenu Web dynamique comme d'autres fra­me­works PHP, Co­deIg­ni­ter utilise une approche segmentée.
    • URL avec chaîne de requête : example.com?con­trol­ler=news&function=article&id=511
    • URL basée sur la seg­men­ta­tion : example.com/news/article/511.
  • Style de pro­gram­ma­tion libre : Co­deIg­ni­ter est basé sur une in­ter­pré­ta­tion libre du modèle d'ar­chi­tec­ture MVC. Cela signifie qu’un style de pro­gram­ma­tion n’est pas prédéfini pour les dé­ve­lop­peurs.
     
  • Do­cu­men­ta­tion complète : Co­deIg­ni­ter dispose d'une do­cu­men­ta­tion complète en anglais, avec un tutoriel pour débutants. En outre, le code source est clair et bien commenté. La do­cu­men­ta­tion de Co­deIg­ni­ter est dis­po­nible sur son site Web officiel. Vous trouverez un guide en ligne ainsi qu’une version té­lé­char­geable.
  • Com­mu­nauté support : les pro­gram­ma­teurs qui dé­ve­lop­pent des ap­pli­ca­tions basées sur Co­deIg­ni­ter peuvent compter sur l'aide d'autres uti­li­sa­teurs. Le projet est en effet soutenu  par une com­mu­nauté active. Un forum public est ac­ces­sible à l'adresse https://forum.co­deig­ni­ter.com. Plus de 7 300 uti­li­sa­teurs échangent leurs points de vue sur l'uti­li­sa­tion et le dé­ve­lop­pe­ment ultérieur du framework.

In­con­vé­nients du framework Co­deIg­ni­ter

Comme le dé­ve­lop­pe­ment du framework Co­deIg­ni­ter a stagné un certain temps avant que le BCIT ne prenne le relais sur la gestion du logiciel, les pro­gram­meurs re­cherchent souvent des dé­ve­lop­pe­ments tech­no­lo­giques qui ont été adaptés par des fra­me­works si­mi­laires au cours des dernières années, mais pas par Co­deIg­ni­ter.

  • ORM de four­nis­seurs tiers uni­que­ment : le mapping objet-re­la­tion­nel (ORM) est une technique de dé­ve­lop­pe­ment logiciel qui permet aux ap­pli­ca­tions de stocker des objets écrits dans un langage de pro­gram­ma­tion orienté objet (tel que PHP) dans une base de données re­la­tion­nelle. Co­deIg­ni­ter ne prend ini­tia­le­ment pas en charge l’ORM. Toutefois, la tech­no­lo­gie peut être intégrée via un four­nis­seur tiers.
  • Pas de moteur de template : Co­deIg­ni­ter se félicite de pouvoir s’en sortir sans moteur de template. Au lieu de cela, le framework met en option un analyseur de template simple à dis­po­si­tion. Certains con­si­dè­rent cela comme un avantage car l’uti­li­sa­tion de moteur de template nécessite gé­né­ra­le­ment un surplus de per­for­mance. De plus, il est souvent né­ces­saire d’apprendre à utiliser le langage du template. D’un autre côté, un moteur de template permet de séparer la pro­duc­tion des données du code pour la pré­sen­ta­tion, ce qui conduit souvent à un code source clai­re­ment structuré. Si un moteur de template avec une syntaxe épurée est utilisé, cela peut réduire sig­ni­fi­ca­ti­ve­ment la portée globale du code de l'ap­pli­ca­tion.
  • Pas d’espace de noms : avec les espaces de noms (na­mes­paces), PHP offre la pos­si­bi­lité de séparer les codes de dif­fé­rents groupes d'ap­pli­ca­tions. Les dé­ve­lop­peurs PHP profitent de cette fonc­tion­na­lité pour éviter les conflits qui peuvent être générés en nommant les classes et les fonctions. Ty­pi­que­ment, on voit souvent ap­pa­raître des col­li­sions de noms avec des classes PHP internes, des fonctions, des cons­tantes ou des éléments intégrés par des four­nis­seurs tiers. Co­deIg­ni­ter n'utilise pas encore cette fonc­tion­na­lité PHP.
  • Pas d’auto-char­ge­ment de classes PHP : depuis la version 5, PHP propose avec __autoload() et spl_autoload_register() deux fonctions qui per­met­tent de charger au­to­ma­ti­que­ment les dé­fi­ni­tions de classes si né­ces­saire. Cette fonc­tion­na­lité n'est pas dis­po­nible dans le framework Co­deIg­ni­ter.
  • Moins de bi­blio­thèques intégrées que les autres fra­me­works PHP : en raison de la con­cep­tion sim­pli­fiée du logiciel, Co­deIg­ni­ter offre beaucoup moins de bi­blio­thèques dans sa con­fi­gu­ra­tion que d’autres fra­me­works PHP. Il s'agit prin­ci­pa­le­ment des tâches les plus im­por­tantes du dé­ve­lop­pe­ment Web, telles que l'accès à la base de données, l’envoi d’emails, la va­li­da­tion des données de for­mu­laires, la main­te­nance des sessions ou le travail avec XML-RPC. Pour les tâches qui vont au-delà des fonc­tion­na­li­tés de base, vous devez inclure vos propres bi­blio­thèques ou res­sources d’un four­nis­seur tiers. Cela peut toutefois être considéré comme un avantage par les dé­ve­lop­peurs qui re­cherchent un framework réduit au minimum.

Co­deIg­ni­ter : données clés

Le tableau suivant présente un aperçu des données clés du framework Co­deIg­ni­ter :

Co­deIg­ni­ter    
Dé­ve­lop­peur British Columbia Institute of Tech­no­logy (BCIT)  
Version actuelle Version 3.1.2  
Modèle de con­cep­tion MVC/HMVC, Active Record, Chain of Res­pon­si­bi­lity  
Con­nais­sances né­ces­saires PHP, pro­gram­ma­tion orientée objet (OOP)  
Langage de pro­gram­ma­tion PHP 5.6 ou plus  
Licence Licence MIT  
Com­pa­ti­bi­lité des bases de données MySQL (5.1+), Oracle, Post­greSQL, MS SQL, SQLite, CUBRID, Interbase/Firebird, ODBC  
ORM Uni­que­ment via un four­nis­seur tiers  
Mise en cache oui  
Moteur de Template non  
Espaces de noms non  
PHP-Auto-Loading non  
URL « propres » oui  
Ca­rac­té­ris­tiques de sécurité Cross-Site-Request-Forgery (XSRF), Cross-Site-Scripting (XSS), SQL-Injection  
Testing library PHP Unit  
En résumé

Grâce à sa con­cep­tion compacte et sa syntaxe simple, Co­deIg­ni­ter est idéal pour les pro­gram­meurs en devenir. Si vous avez déjà une première ex­pé­rience en dé­ve­lop­pe­ment Web dynamique basé sur PHP, vous vous adapterez en un rien de temps au framework basé PHP très léger. Les dé­ve­lop­peurs Web ex­pé­ri­men­tés ap­pré­cie­ront quant à eux sa flexi­bi­lité.

Cependant, toute personne qui souhaite utiliser Co­deIg­ni­ter doit pouvoir faire au modèle d'ar­chi­tec­ture MVC et se passer d'un moteur de template ainsi que d'un mapping objet-re­la­tion­nel natif. Co­deIg­ni­ter reste malgré tout adapté aux petits et grands projets Web, et ce même s’il présente un code minimal.

Aller au menu principal