Le site
Pour rendre votre site fonctionnel, il faut ajouter quelques fichiers et en modifier d'autres
Méthode : Public
Dans le dossier public gardez que le fichier index.php et .htaccess.
public/index.php
1
<?php
2
require '../app/functions.php';
3
require '../app/models/model.php';
4
require '../app/routes.php';
5
6
// on récupère l'uri réécrite et le root
7
$uri = parse_url($_SERVER['REQUEST_URI'])['path'];
8
$root = dirname($_SERVER['PHP_SELF']);
9
$root = $root == '\\' ? '' : $root;
10
$uri = str_replace($root, '', $uri);
11
12
$route = getRoute($routes, $uri);
13
14
if ($route) {
15
$controller = $route[2][0];
16
$action = $route[2][1];
17
} else {
18
$controller = 'error';
19
$action = 'index';
20
}
21
22
require "../app/controllers/$controller/$action.php";
Méthode : app/functions.php
Ce fichier contient l'ensemble des fonctions vues précédemment.
1
<?php
2
3
// permet de rechercher la route correspondant à l'uri
4
function getRoute($routes, $uri)
5
{
6
foreach ($routes as $route) {
7
// pattern pour retrouver les paramettres : -{id}-{slug} --> id et slug
8
$pattern = '/-{([^}]+)}/';
9
10
// pattern verifiant le lien entre path et uri :
11
// à partir de : /afficher-personne-{id}-{slug}
12
// on crée le pattern : /afficher-personne-[^-]+-[^-]+
13
// permet de matcher avec : /afficher-personne-1-dupont
14
$pattern = '/^\\' . preg_replace($pattern, '-[^-]+', $route[0]) . '$/';
15
16
if (preg_match($pattern, $uri))
17
return $route;
18
}
19
return null;
20
}
21
// permet de retourner la valeur d'un paramètre
22
function getParams($key)
23
{
24
global $route;
25
global $uri;
26
// récupère la partie fixe de la route
27
$pattern = '/-{([^}]+)}/';
28
$fixe = preg_replace($pattern, '', $route[0]);
29
30
// récupère les paramètres du path de la route
31
preg_match_all($pattern, $route[0] ?? '', $keys);
32
33
// récupère la partie variable de l'uri
34
$variables = str_replace($fixe, '', $uri);
35
36
// récupère les valeurs des paramètres de l'uri
37
$pattern = "/-([^-]+)/";
38
preg_match_all($pattern, $variables, $values);
39
40
// génére un tableau associatif avec les keys et les values
41
$params = array_combine($keys[1], $values[1]);
42
43
// on retourne la valeur correspondant à la clé
44
return $params[$key] ?? null;
45
}
46
47
// permet de générer l'uri à partir du nom de la route
48
// route('personne.index') => '/personnes'
49
// route('personne.show', ['id'=>1]) => '/afficher-personne-1'
50
function route(string $name, array $vars = [])
51
{
52
global $routes;
53
global $root;
54
55
foreach ($routes as $route) {
56
57
if ($route[1] == $name) {
58
59
foreach ($vars as $key => $val) {
60
$route[0] = str_replace('{' . $key . '}', $val, $route[0]);
61
}
62
return $root . $route[0];
63
}
64
}
65
66
return '';
67
}
68
69
// permet d'appeler la vue en fonction de sa clé
70
function view($name, $vars = [])
71
{
72
extract($vars);
73
$url = str_replace(".", "/", $name);
74
require "../app/views/$url.php";
75
}
La fonction view() permettra de remplacer les require de vue.
Méthode : app/routes.php
Ensemble des routes du site.
1
<?php
2
$routes = [];
3
// $routes[] = [path, name, [controller, action]];
4
// path : uri de la ressource. {param} indique l'utilisation d'un paramètre
5
// name : clé unique de la route
6
// controller : dossier où se trouve réllement la ressource
7
// action : nom du fichier de la ressource sans son extension
8
$routes[] = ['/', 'home.index', ['home', 'index']];
9
$routes[] = ['/personnes', 'personne.index', ['personne', 'index']];
10
$routes[] = ['/ajouter-personne', 'personne.create', ['personne', 'create']];
11
$routes[] = ['/afficher-personne-{id}', 'personne.show', ['personne', 'show']];
12
$routes[] = ['/modifier-personne-{id}', 'personne.update', ['personne', 'update']];
13
$routes[] = ['/supprimer-personne-{id}', 'personne.delete', ['personne', 'delete']];
Méthode : Dans les controllers
Dans tous les controllers supprimez la ligne :
1
require '../app/models/model.php';
Modifiez les lignes
1
$id = $_GET['id'] ?? '';
par
1
$id = getParams('id');
Modifiez les lignes
1
header('location:personnes.php');
par
1
header('location:' . route('personne.index'));
Modifiez
1
require '../app/views/theme/action.php';
En fonction des cas theme = home ou personne et action = index, create, show, update ou delete.
Remplacez par
1
view('theme.action', compact(['a', 'b']));
a et b correspondent aux noms des variables à transmettre.
Vous devriez avoir écris :
1
view('home.index', compact(['page_title']));
2
view('personne.create', compact(['page_title']));
3
view('personne.delete', compact(['page_title','personne']));
4
view('personne.index', compact(['page_title', 'listePersonnes']));
5
view('personne.show', compact(['page_title', 'personne']));
6
view('personne.update', compact(['page_title', 'personne']));
Méthode : app/views/header.php
1
<header>
2
<nav>
3
<ul>
4
<li><a href='= route('home.index') '>Accueil</a></li>
5
<li><a href='= route('personne.index') '>Personnes</a></li>
6
</ul>
7
</nav>
8
</header>
Méthode : Dans les views
Remplacez
1
<?php require '../app/views/head.php' ?>
2
<?php require '../app/views/header.php' ?>
3
<?php require '../app/views/footer.php' ?>
4
create.php
5
personnes.php
par
1
<?= view('head', compact('page_title')) ?>
2
<?= view('header') ?>
3
<?= view('footer') ?>
4
<?= route('personne.create') ?>
5
<?= route('personne.index') ?>
Méthode : app/views/personne/index.php
Remplacez
1
<a href='show.php?id=<?= $personne['id'] ?>'>
2
<a href='delete.php?id=<?= $personne['id'] ?>'>
3
<a href='update.php?id=<?= $personne['id'] ?>'>
par
1
<a href='<?= route('personne.show', ['id'=> $personne['id']]) ?>'>
2
<a href='<?= route('personne.delete', ['id'=> $personne['id']]) ?>'>
3
<a href='<?= route('personne.update', ['id'=> $personne['id']]) ?>'>