Bonjour à tous,

J'ai suivi de nombreux tutoriels sur la POO et MVC et je rencontre une difficulté.
Pour commencer voici l'architecture de mon site de test:
Nom : architecture.PNG
Affichages : 182
Taille : 9,8 Ko
Voici également mon fichier .htaccess
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ index.php [QSA,L]
Avec mon Controlleur HomeController.php, je parviens bien à afficher ma vue HomeView.php
Donc quand j'essaye d’accéder à http://test/home/ j'ai le résultat souhaité.
En revanche si je tape http://test/home/coucou , la page HomeView n'est plus chargée hors je souhaite garder la suite de l'url comme paramètres éventuels.
je ne sais pas si mon problème viens de ma redirection d'URL qui serait trop stricte ou s'il vient d'une fonction que je ne maitrise pas bien dans ma classe Application:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
call_user_func_array([$this->controller, $this->action],$this->params);
Voici ma classe Controller
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
class Controller
{
    protected $view;
    public function view($name,$dir,$params=[]) {
        $this->view = new View($name,$dir,$params);
        return $this->view;
    }
}
puis ma classe HomeController
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
class HomeController extends \Controller
{
    public function HomeView() {
        $this->view('HomeView','home');
        $this->view->render();
    }
}
Ma classe view
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class View
{
    protected $viewFile;
    protected $viewParams=[];
    protected $viewDir;
 
    public function __construct($view_file,$viewDir,$view_data)
    {
        $this->viewFile=$view_file;
        $this->viewParams=$view_data;
        $this->viewDir = $viewDir;
    }
    public function render(){
        if (file_exists(VIEWS.$this->viewDir.DIRECTORY_SEPARATOR.$this->viewFile.'.php')) {
           include VIEWS.$this->viewDir.DIRECTORY_SEPARATOR.$this->viewFile.'.php';
        }
    }
}
Ma classe application
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Application
{
    private $controller= 'Home\HomeController';
    private $url="Home";
    private $action="HomeView";
    private $file = CONTROLLERS.DIRECTORY_SEPARATOR.'Home'.DIRECTORY_SEPARATOR.'HomeController.php';
    private $params=[];
    public function __construct()
    {
        $this->getURL();
        if (file_exists($this->file)){
           $this->controller=new $this->controller;
            if (method_exists($this->controller,$this->url.'View')){
                call_user_func_array([$this->controller, $this->action],$this->params);
            } else {
                echo "<p>La méthode n'existe pas</p>";
            }
        }
    }
    protected function getURL(){
        $url = trim($_SERVER['REQUEST_URI'],'/');
        if(!empty($url)) {
            $params = explode('/',$url);
            $this->url=ucfirst(strtolower($params[0]));
            $this->controller = $url.DIRECTORY_SEPARATOR.ucfirst(strtolower($params[0]))."Controller";
            $this->file=CONTROLLERS.$this->controller.'.php';
            $this->action = $this->url.'View';
            unset($params[0]);
            $this->params=$params;
        }
    }
}
Et mon routeur (index.php)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
define('ROOT', dirname(__DIR__).DIRECTORY_SEPARATOR.'test'.DIRECTORY_SEPARATOR);
define('VIEWS',ROOT.'views'.DIRECTORY_SEPARATOR);
define('MODELS',ROOT.'models'.DIRECTORY_SEPARATOR);
define('CONTROLLERS',ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('PUBLICS',ROOT.'public'.DIRECTORY_SEPARATOR);
define('CORE',ROOT.'core'.DIRECTORY_SEPARATOR);
$modules = [ROOT, VIEWS, MODELS, CONTROLLERS, PUBLICS, CORE];
set_include_path(get_include_path().PATH_SEPARATOR.implode(PATH_SEPARATOR,$modules));
spl_autoload_register('spl_autoload', false);
ob_start();
//Appel du Controller principal
new Application();
$content = ob_get_clean();
?>
<?php
include PUBLICS.'template.php';
?>
Auriez vous la gentillesse de bien vouloir m'aider SVP ?
En espérant avoir été assez précis, je vous remercie par avance de votre aide.

Bonne journée