Vous êtes sur la page 1sur 11

PHP

Tutoriel CodeIgniter 4
Laurent d’Orazio
2020/2021

1. Résumé
Le but de ce document est d’aider à l’installation du Framework PHP CodeIgniter, de donner
un aperçu de son architecture et de son fonctionnement.
Ce document est une adaptation du guide utilisateur de CodeIgniter version 4. Les différentes
documentations sont accessibles à l’adresse suivante :
http://www.codeigniter.com/docs

2. Installation
2.1. Pré-requis système
• Php 7.2 ou plus
• Une base de données
2.2. Téléchargement
Télécharger CodeIgniter sur la page de téléchargement :
https://www.codeigniter.com/download
2.3. Installation
CodeIgniter s’installe manuellement en quatre étapes :
• Etape 1 : Décompresser l’archive.
• Etape 2 : Charger les dossiers et fichiers CodeIgniter sur votre serveur. Normalement
le répertoire public se trouve sur votre racine. Il est possible de placer le répertoire de
projet ailleurs, mais il faudra en tenir compte dans la configuration.
• Etape 4. Si une base de données est utilisée, ouvrir le fichier
application/config/database.php avec un éditeur de texte pour y saisir les paramètres
concernant la base de données. Les variables suivantes doivent être modifiées :
'DSN' => '',
'hostname' => 'servbdd.iutlan.etu.univ-rennes1.fr',
'username' => '<votre login>',
'password' => '<votre mot de passe>',
'database' => 'pg_<votre login>',
'DBDriver' => 'postgre',
Renseigner le préfixe peut être utile si les tables sont placées dans un schéma particulier (ici
taches), par exemple. Il faut alors modifier la variable suivante :
'DBPrefix' => '',
Après ce tutoriel, il est possible d’augmenter la sécurité de l’application, en suivant les conseils
de la page Sécurité.

Laurent d’Orazio, 2020/2021


1
3. Cas d’utilisation
Ce tutoriel a pour but d’introduire le Framework CodeIgniter et les principes de base de
l’architecture MVC. Il montrera comment développer une application avec CodeIgniter, étape
par étape.
Dans ce tutoriel sera créée une application basique de gestion de tâches. Dans un premier
temps, il présente le code permettant le chargement de pages statiques. Par la suite il
détaillera une rubrique Taches qui cherchera les tâches dans une base de données. Enfin, sera
ajouté un formulaire pour créer des nouvelles données qui seront insérées dans la base de
données.
Ce tutoriel se focalisera d’abord sur :
• les bases de l’architecture Model-View-Controller ;
• les bases du routage ;
• la validation de formulaire ;
• la conception de requêtes basiques vers la base de données.

4. Pages statiques
La première chose à faire est de paramétrer le contrôleur pour gérer des pages statiques. Un
contrôleur est une classe qui délègue le travail. C’est le centre de l’application Web.
Par exemple, quand un appel à : http://example.com/taches/compter/enfant suggère
l’existence d’un contrôleur appelé taches. La méthode qui sera appelée pour taches sera
compter. Le rôle de la méthode compter sera de compter les tâches qui contiennent la chaîne
enfant, et de donner ce décompte sur une page. Le MVC est souvent associé à des motifs
(patterns) d’URL qui correspondent à
http://example.com/[controller-class]/[controller-method]/[arguments]
Créer un fichier application/controllers/Statiques.php avec le code qui suit. Faire
attention à ce que le nom du contrôleur (de la classe) et le nom du fichier correspondent bien.
Ils doivent tous les deux comporter une majuscule.
<?php namespace App\Controllers;
use CodeIgniter\Controller;

class Statiques extends Controller {

public function afficher($page = 'home')


{
}

}
Figure 1. Ébauche de contrôleur Pages (app/controllers/Statiques.php)

Ce code correspond à une classe nommée Statiques, avec une méthode qui prend un
paramètre nommé $page. Cette classe Statiques hérite de la classe Controller. Cela
signifie que la nouvelle classe peut accéder aux méthodes et attributs définis dans la classe
Controller (system/Controller.php).

Laurent d’Orazio, 2020/2021


2
Le contrôleur va être le centre de traitement de toute requête adressée à l’application Web.
Il peut être appelé super object. $this permet d’y faire référence. Se référer à $this est la
manière qui sera utilisée pour charger les bibliothèques (libraries), les vues et plus
généralement pour commander le Framework.
Des templates basiques de page vont être proposés. Dans un premier temps, des « vues »
entete et pied vont être créées pour prendre en charge l’aspect général d’une page, qui
laissera de la place pour le chargement de sous-vues pour des contenus particuliers.
<!doctype html>
<html>
<head>
<title>
<?php echo $contenu;?> - Tutoriel CodeIgniter 4
</title>
</head>
<body>
<div id="entete">
<h1> Tutoriel CodeIgniter 4 </h1>
</div><!-- # entete -->
<h1><?= $titre; ?></h1>
Figure 2. App/views/entete.php

<div id="pied">
<strong>&copy;2020</strong>
</div><!--#pied-->
</body>
</html>
Figure 3. App/views/pied.php

Les scripts entete.php et pied.php contiennent le code HTML de base qui sera affiché pour
chaque page. Il affichera également la variable $contenu, qui sera définie plus tard dans le
contrôleur.
4.1. Logique du contrôleur
Le contrôleur défini précédemment propose une méthode afficher. La méthode accepte un
paramètre qui est le nom de la page à charger. Les fichiers entete.php et pied.php de page
statique seront situés dans le répertoire application/views/templates/.
Dans le répertoire /views/statiques/, créer deux fichiers nommés accueil.php et
credit.php. Dans ces fichiers, saisir un texte et enregistrer.

Pour charger ces contenus, il convient de vérifier que la page demandée existe. Compléter la
méthode afficher de la façon suivante dans le contrôleur
app/controllers/Statiques.php

Laurent d’Orazio, 2020/2021


3
public function afficher($contenu = 'accueil')
{
if ( ! is_file(APPPATH.'/Views/statiques/'.$contenu.'.php'))
{
// Whoops, we don't have a page for that!
throw new
\CodeIgniter\Exceptions\PageNotFoundException($contenu);
}

$data['titre'] = ucfirst($contenu); // Capitalize the first letter


$data['contenu'] = $contenu;

echo view('templates/entete', $data);


echo view('statiques/'.$contenu, $data);
echo view('templates/pied', $data);
}
Figure 4. Ajout d’une méthode afficher dans le contrôleur (application/controllers/Staticpages.php)

Quand la page existe, elle est chargée, incluant le début et la fin de page, et affichée à
l’utilisateur. Si la page n’existe pas, un message d’erreur 404 Page not found est affiché.
La première ligne de cette méthode vérifie si la vue existe vraiment. La fonction is_file()
est utilisée pour vérifier si le fichier est bien là où on s’attend qu’il soit.
PageNotFoundException() est une fonction de CodeIgniter qui renvoie une page d’erreur.

Dans le template de page (entete), la variable $contenu est utilisée pour personnaliser le
titre de page. La valeur de ce titre est définie dans cette méthode, mais au lieu d’assigner la
valeur à une variable, elle est assignée à l’élément contenu du tableau $data.
La dernière chose à faire est de charger les vues afin de les afficher. Les valeurs stockées dans
le tableau $data sont globales et donc accessibles aux vues, ainsi qu’à toutes les sous-vues en
cascade. Chaque valeur dans le tableau $data est assignée à une variable dont le nom est
celui de la clé du tableau. Ainsi la valeur de $data['contenu'] dans le contrôleur est celle de
la variable $contenu dans la vue. C’est le même effet que la fonction PHP native extract()
(qui est d’ailleurs utilisée dans CodeIgniter).
La variable $contenu va également servir à indiquer le nom de la sous-vue à appeler pour
l’insérer au milieu de la page entete.php. L’appel à echo view()va charger cette vue
principale en lui communiquant le nom de la sous-vue à appeler (ici accueil par défaut, ou
credit si on l’indique au contrôleur) dans le div de contenu.

4.2. Routage
Le contrôleur est maintenant fonctionnel. Pour consulter la page, faire à présent pointer le
navigateur vers :
[site-url]index.php/statiques/afficher
Consulter index.php/statiques/afficher/credit, permet de visualiser la page credit,
insérée elle aussi dans le template.
Utiliser des règles sur mesure de routage permet de faire correspondre n’importe quelle URI
à n’importe quel contrôleur ou méthode, et ainsi de se libérer des conventions habituelles :
http://example.com/[controller-class]/[controller-method]/[arguments]
Ouvrir le fichier de routage situé en app/config/routes.php et remplacer les lignes
existantes par :
$routes->get('/', 'Statiques::index');

Laurent d’Orazio, 2020/2021


4
cela ne fonctionnera pas car le contrôleur ne comporte pas de méthode index(). Un moyen
de s’en sortir temporairement est de compléter la classe du contrôleur Statiques par cette
méthode qui fait appel à la méthode afficher() du même contrôleur.
public function index(){
$this->afficher('accueil');
}
CodeIgniter lit ses règles de routage du haut en bas et route les requêtes vers la première
règle correspondante rencontrée. Chaque règle est une expression régulière (membre à
gauche) mise en correspondance avec un contrôleur et un nom de méthode séparés par des
deux points (membre à droite). Quand une requête arrive, CodeIgniter cherche la première
correspondance, et appelle le contrôleur et la méthode appropriés, éventuellement avec ses
arguments.
Plus d’information sur le routage peut être trouvé dans la documentation sur le routage d’URI.

5. Affichage de données
Cette section introduit la gestion de contenus dynamiques en utilisant une base de données.
5.1. Définition du modèle
Au lieu d’écrire les opérations sur la base de données directement dans le contrôleur, les
requêtes doivent être placées dans un modèle, de telle façon qu’elles puissent être facilement
réutilisées plus tard. Les modèles sont l’endroit où il est possible de rechercher, insérer et
mettre à jour des informations dans la base de données ou dans d’autres supports de
stockage. Ils représentent les données.
Ouvrir le répertoire app/models et créer un nouveau fichier appelé TachesModel.php et
ajouter le code suivant. Il convient de bien avoir configuré votre base de données dans
CodeIgniter.
<?php namespace App\Models;

use CodeIgniter\Model;

class TachesModel extends Model{

protected $table = 'tache';

}
?>
Figure 5. Ébauche de modèle (app/models/Tachesmodel.php)

Ce code semble similaire à celui utilisé plus tôt. Il crée un nouveau modèle qui étend Model et
qui charge la bibliothèque de gestion de base de données. Cela rend la classe d’accès à la base
de données disponible au travers de l’objet $this->db.
A noter que si elle n’existe pas, une base de données doit être créée.
Une fois la base de données et le modèle définis, il sera nécessaire de proposer une méthode
pour récupérer tous les enregistrements de la base de données. Pour faire cela, la couche
d’abstraction qui est incluse dans CodeIgniter – Query Builder – est utilisée. Cela rend
possible d’écrire les « requêtes » une fois et de les faire fonctionner sur tous les systèmes de
gestion de bases de données supportés.

Laurent d’Orazio, 2020/2021


5
Ajouter le code suivant au modèle qui permet de récupérer des enregistrements spécifiques
(ici des tâches), sous forme de tableau :
public function recTaches()
{
return $this->findAll();
}
Figure 6. Compléments de méthodes pour le modèle (app/models/Tachemodel.php)

5.2. Affichage des données

Maintenant que les requêtes sont écrites, le modèle devrait être lié à des vues qui vont
afficher les données aux utilisateurs. Cela pourrait être fait dans le contrôleur créé
précédemment, mais pour des raisons de clarté, un nouveau contrôleur Taches est défini.
Créer le nouveau contrôleur dans app/controllers/Taches.php.
<?php namespace App\Controllers;
use App\Models\TachesModel;
use CodeIgniter\Controller;

class Taches extends Controller


{
public function index()
{
$model = new TachesModel();

$data = [
'taches' => $model->recTaches(),
'titre' => 'Liste de tâches',
];
}
}
Figure 7. Nouveau contrôleur ListeDeTaches (app/controlers/ListeDeTaches.php)

Le modèle TacheModel est chargé, de façon à ce qu’il puisse être utilisé dans toutes les autres
méthodes dans ce contrôleur. Ensuite, il y a une méthode pour lister les tâches.
A cette étape, les données sont récupérées dans le contrôleur au travers du modèle, mais rien
n’est encore affiché. La prochaine chose à faire est de fournir les données aux vues. Compléter
le code de la méthode index du contrôleur avec le code qui suit.
public function index()
{
$model = new TachesModel();

$data = [
'taches' => $model->recTaches(),
'titre' => 'Liste de tâches',
];
echo view('taches/apercu', $data);
}
Figure 8. Méthode index du contrôleur Taches (ap/controlers/Taches.php)

Le code ci-dessus récupère toutes les données au travers du modèle et les assigne à une
variable. La valeur du titre de la page web à afficher est également affectée à l’élément
$data['titre'] et toutes les données sont passées aux vues. Il est maintenant nécessaire
de créer une vue pour afficher les données (ici les tâches).
Créer le fichier application/views/taches/apercu.php et ajouter ce bout de code.
<h2><?= $titre ?></h2>

Laurent d’Orazio, 2020/2021


6
<?php if (! empty($taches) && is_array($taches)) : ?>
<ul>
<?php foreach ($taches as $tache): ?>
<?php echo "<li > ".$tache['id'].". ".$tache['tache']." </li >";?>
<?php endforeach; ?>
</ul>
<?php else : ?>
<h3>Rien à faire</h3>
<p>Pas de nouvelle tâche à réaliser.</p>
<?php endif ?>
Figure 9. Patron de la liste de données (app/views/taches/apercu.php)

Ici, chaque tâche est prise dans une boucle et affichée à l’utilisateur. Il est possible de voir que
le template a été écrit en mixant PHP et HTML. D’autres langages de template peuvent être
utilisés, à l’aide de la classe Template Parser de CodeIgniter ou tout autre parser de template
externe.
5.3. Routage
A cause de règle de routage sur mesure créée plus tôt, il est nécessaire d’avoir une autre route
pour voir ce nouveau contrôleur. Modifier le fichier de routage (app/config/routes.php)
afin qu’il ressemble au code qui suit. Cela assure que les requêtes atteignent le contrôleur
Taches au lieu d’aller directement au contrôleur de pages statiques.
$routes->get('/', 'Taches');

Pointer le navigateur vers la racine du site, suivie de public permet d’afficher la page des
tâches. Cela fonctionne ici car aucune méthode n’est précisée dans l’URI et que, dans ce cas,
la méthode appelée par défaut est la méthode index.

6. Création de données
Cette section vise à étendre le contrôleur et le modèle de Liste de Tâches créés plus tôt pour
inclure cette fonctionnalité.
6.1. Création d’un formulaire
Pour insérer des données dans une base, créer un formulaire permettant de saisir des
informations à stocker.
Créer une nouvelle vue dans application/views/taches/creation.php.
<h2><?= esc($titre); ?></h2>

<?= \Config\Services::validation()->listErrors(); ?>

<?php
echo form_open('/taches/creation');
//<form action="/taches/creation">
?>
<label for="tache">Tâche</label>
<input type="input" name="tache" /><br />
<input type="submit" name="submit" value="Creéer une nouvelle tâche" />
</form>
Figure 10. Vue pour le formulaire (app/views/listeDeTaches/creation.php)

La fonction form_open() est fournie par le helper form et affiche l’élément de formulaire et
offre des fonctionnalités additionnelles, comme ajouter un champ de prévention d’attaques
CSFR (Cross-Site Request Forgery).

Laurent d’Orazio, 2020/2021


7
La fonction validation()->listErrors() est utilisée pour remonter les erreurs relatives à
la validation de formulaires.
Au sein du contrôleur il convient de vérifier que le formulaire a bien été soumis et que les
données envoyées vérifient les règles de validation. Utiliser la bibliothèque logicielle
validate pour faire cela. Ajouter le code de la méthode suivante au contrôleur :
public function creation()
{
helper('form');
$model = new TachesModel();

if (! $this->validate([
'tache' => 'required|min_length[3]|max_length[30]'
]))
{
echo view('taches/creation', ['titre' => 'Creation de nouvelle
tache']);
}
else
{
$model->save([
'tache' => $this->request->getVar('tache'),
]);
echo view('taches/reussite');
}
}
Figure 11. Méthode creation du contrôleur (app/controlers/ListeDeTaches.php

Le code ci-dessus ajoute des fonctionnalités. Les deux premières lignes chargent le helper
'form' et la bibliothèque de validation de formulaire. Ensuite, les règles de validation sont
définies. Par exemple ici la valeur de tache est obligatoire et doit être comprise en 3 et 30
caractères.
Ce script contient une condition qui vérifie que la validation de formulaire s’est bien déroulée.
Si non, le formulaire est affiché, et s’il a été soumis et s’il a vérifié toutes les règles, on récupère
le paramètre POST avec $this->request->getVar() et le modèle est appelé. La méthode
s’assure que les données sont propres, protégeant des attaques malveillantes. La bibliothèque
request est chargée par défaut.
Après quoi une sous-vue est définie pour afficher un message de réussite. Créer une vue dans
app/views/taches/reussite.php et saisir un message de réussite.

6.2. Modèle
Il reste à adapter le modèle pour permettre aux données d’être enregistrées correctement.
La méthode save() qui a été utilisée va vérifier si les informations peuvent être insérées ou
si l’enregistrement existe déjà et doit être mis à jour, en fonction de la présence d’une clé
primaire.
Par défaut, les méthodes insert and update du modèle ne permettent pas d’enregistrer de
nouvelles données parce qu’elles ne savent pas quels sont les champs autorisés à être
modifiés. Il faut modifier le modèle pour fournir une liste de ces champs à l’aide de
$allowedFields.

Laurent d’Orazio, 2020/2021


8
class TachesModel extends Model{

protected $table = 'tache';

protected $allowedFields = ['tache'];

public function recTaches()


{
return $this->findAll();
}
}
Figure 12. Autorisation ajout de tâche dans le modèle (app/models/TachesModel.php)

Cette propriété contient maintenant les champs pouvant être enregistrés dans la base de
données. Il convient de noter que id n’est pas pris en compte. Il n’est en effet quasiment
jamais utile de le prendre en compte puisqu’il sera incrémenté de manière automatique. Ceci
aide à protéger l’application des vulnérabilités de type affectation de masse.
6.3. Test
Faire pointer le navigateur là où est installé CodeIgniter et ajouter public/taches/creation
à l’URL. Ajouter quelques tâches et vérifier les différentes pages créées.

7. Suppression de données
L’objectif est de pouvoir supprimer une tâche en cliquant par exemple sur un lien qui
apparaîtrait à côté de son intitulé. Dans cette section, la vue va être étendue pour ajouter ce
lien pour chaque tâche affichée, étendre le contrôleur et le modèle pour gérer cette
suppression.
7.1. Vue
Il suffit de respecter l’écriture http://example.com/[controller-class]/[controller-
method]/[arguments] pour envoyer des arguments à une méthode d’un contrôleur. Cette
approche sera appliquée ici. Une méthode suppression($num) sera créée dans le contrôleur
Taches qui supprimera la tâche numéro $num. Il suffira d’appeler l’URL suivante pour
supprimer la tâche 2 par exemple :
[your-site-url]/public/listedetaches/suppression/2
Cela peut être généraliser en modifiant la vue app/views/taches/apercu.php de la façon
suivante :
<ul>
<?php foreach ($taches as $tache): ?>
<li>
<?php echo $tache['id'].". ".$tache['tache']."
".anchor('taches/suppression/'.$tache['id'],'[supp]');?>
</li>
<?php endforeach; ?>
</ul>
Figure 13. Vue modifiée de la liste des tâches (app/views/taches/apercu.php)

La fonction anchor() a pour effet de créer un lien en se basant sur l’URL de base. Il est
important d’utiliser cette fonction plutôt que d’insérer un lien en dur dans le code pour la
migration éventuelle du site. Ici, il suffit de modifier l’URL de base pour faire fonctionner
l’application sur un autre serveur (et éventuellement migrer la base de données également).

Laurent d’Orazio, 2020/2021


9
Il faut également ajouter une vue qui affiche un message de succès après la suppression de la
tâche, app/views/taches/suppression.php.
7.2. Contrôleur
Il faut ajouter la méthode suppression dans le contrôleur app/controllers/Taches.php.
public function suppression($num)
{
$model = new ListeDeTachesModel();
$model->delete($num);
echo view('taches/suppression');
}
Figure 14. Méthode supplémentaire suppression dans le contrôleur Taches (app/controllers/Taches.php)

8. Application finale
L’inconvénient majeur de l’application précédente est que l’affichage du formulaire et de la
liste des données, de la suppression ou de l’ajout d’une donnée sont dissociés. Il faudrait que
le succès d’un ajout ou d’une suppression amène de nouveau sur la page affichant la liste des
données précédée par le formulaire de saisie d’une nouvelle donnée.
8.1. Fusion d’index et de creation
Pour commencer, copier le fichier taches.php en taches2.php (et renommer en conséquence
le contrôleur).
Il convient ensuite de fusionner les deux méthodes du contrôleur index et creation puisque
qu’à chaque accès à la page principale de l’application, il faut afficher le formulaire puis la liste
des données. En reprenant la logique de la méthode creer, que l’on vienne pour la première
fois sur le formulaire ou qu’on ait soumis une nouvelle donnée, on doit afficher la liste des
tâches.
Remplacer la méthode index comme suit :
public function index()
{
helper('form');
$model = new TachesModel();
//affichage du formulaire de creation
echo view('taches2/creation', ['titre' => 'Creation d\'une nouvelle
tache']);
//affichage de reussite de creation si formulaire validé
if($this->validate(['tache' =>
'required|min_length[3]|max_length[30]']))
{
$model->save([
'tache' => $this->request->getVar('tache'),
]);
echo view('taches/reussite');
}
//affichage de la liste des taches
$data = [
'titre' => 'Liste de tâches ',
'contenu' => 'Liste de tâches ',
'taches' => $model->recTaches()
];
echo view('taches2/apercu', $data);
}
Figure 15. Nouvelle méthode index fusionnée avec creation (app/controllers/Taches2.php)

Laurent d’Orazio, 2020/2021


10
Il faut bien faire attention de charger la liste des données depuis la base de données après
l’ajout éventuel d’une nouvelle donnée, ou plus simplement, juste avant l’affichage de la liste.
Il faut aussi que la cible du formulaire ne soit plus la méthode creation, mais la méthode index.
Copier la vue app/views/taches/creation.php en app/views/taches2/creation.php
Dans la vue app/views/taches2/creation.php, remplacer
<?php echo form_open('taches/creation') ?>
par
<?php echo form_open('taches2/index') ?>

8.2. Suppression revenant à l’index


Une fois que la donnée a été supprimée, il faudrait afficher de nouveau la page d’accueil avec
le formulaire et la liste, c’est-à-dire exécuter le code de la méthode index. Cela se fait à l’aide
d’un appel à cette méthode au sein de la méthode suppression, au lieu de faire appel à la
vue suppression :
public function suppression($num)
{
$model = new ListeDeTachesModel();
$model->delete($num);
$this->index();
}
Figure 16. Nouvelle méthode suppression dans le contrôleur (app/controllers/Taches2.php)

8.3. Modification lien


Il convient finalement de modifier le fichier apercu.php pour pointer vers la nouvelle version
du contrôleur.
<ul>
<?php foreach ($taches as $tache): ?>
<li>
<?php echo $tache['id'].". ".$tache['tache']."
".anchor('taches2/suppression/'.$tache['id'],'[supp]');?>
</li>
Figure 17. Nouveau lien dans apercu (app/views/taches2/apercu.php)

9. Conclusion
Ce tutoriel ne couvre qu’un sous ensemble des possibilités offertes par le canevas. La
documentation est très riche, un regard attentif devra être porté sur les sections
« introduction » et « aspects généraux ».

10. Bibliographie
https://www.codeigniter.com

Remerciements
Merci à Arnaud Delhay-Lorrain, Jean-Bernard Léauté et tous les collègues ayant contribué aux
précédentes versions de ce document.

Laurent d’Orazio, 2020/2021


11

Vous aimerez peut-être aussi