Le modèle MVC va permettre de clarifier la situation :

Le fichier index sert de routeur qui va créer le bon contrôler qui va lui même faire appel au modèle (les données) puis à la vue.

mvc

Paquet http-foundation

cf : https://packagist.org/packages/symfony/http-foundation

Il est tout à fait possible de se passer de paquets tiers pour mettre en place une achitecture MVC mais je choisis ici d'utiliser le paquet http-foundation de symfony car c'est l'occasion de s'initier à ce framework qui est un incontournable depuis plusieurs années.

http-foundation va principalement nous permettre  :

  • d'accéder aux requêtes (Request) des internautes
  • de renvoyer des réponses (Response).

Anatomie d'une requête HTTP 

Une requête http est composée :

  • d'une entête générale (que ce soit une requête ou une réponse)
    Ex d'entête générale :
    	Cache-Control: no-cache, private
    	Connection: close
    	Content-Length: 272
    	Content-Type: application/json
    	Date: Fri, 25 Sep 2020 09:12:42 GMT
    	Server: Apache/2.4.29 (Ubuntu)
  • d'une entête spécifique à la requête ou à la réponse. Ex d'entête de requête  :

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Accept-Encoding: gzip, deflate
    Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7
    Cache-Control: max-age=0
    Connection: keep-alive
    Host: local.mvc.my
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
  • du corps de la requête qui est compris dans le "payload". Ex de corps en post lorsque l'on renseigne un formulaire d'identification :
    {name: "bob", pass: "542587155DiidO:;"}

Paquet routing

cf https://packagist.org/packages/symfony/routing

Comme son nom l'indique, le paquet /symfony/routing va nous permettre de gérer les routes. C'est l'occasion de définir ce qu'est une route :

Dans le paradigme du développement web, les routes sont les mécanismes qui permettent de savoir vers quel code le fil d'éxécution doit renvoyer en fonction de la requête HTTP qui est envoyée au serveur.

Installation

composer require symfony/http-foundation
composer require symfony/routing

Première version de notre fichier de "routing"

Le fichier index.php que vous voyez ci-dessous nécessite que vous ayez mis en place :

  • le mécanisme d'autoloading

    "autoload": {
            "psr-4": {
                "Src\\": "src/"
            }
        }
  • la classe Controller dans Src\controller
<?php
require '../vendor/autoload.php';

use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Src\Controller;

try
{
    // Init basic routes
    $home_route = new Route(
      '/',
      array('controller' => 'HomeController')
    );
    
 
    // Add Route object(s) to RouteCollection object
    $routes = new RouteCollection();
    $routes->add('home_route', $home_route);
    
 
    // Init RequestContext object
    $context = new RequestContext();
    $context->fromRequest(Request::createFromGlobals());
 
    // Init UrlMatcher object
    $matcher = new UrlMatcher($routes, $context);
 
    // Find the current route
    $parameters = $matcher->match($context->getPathInfo());
    /** 
     * Appel du controler avec les bons paramètres : 
     *  - le nom de la route
     *  - le nom du contrôleur impliqué
    */
    //var_dump($parameters);
    $controller = new Controller($parameters);
    
    
    exit;
}
catch (ResourceNotFoundException $e)
{
  echo $e->getMessage();
}