Le site

Pour rendre votre site fonctionnel, il faut ajouter quelques fichiers et en modifier d'autres

MéthodePublic

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éthodeapp/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éthodeapp/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éthodeDans 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éthodeapp/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éthodeDans 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éthodeapp/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']]) ?>'>