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:
Voici également mon fichier .htaccess
Avec mon Controlleur HomeController.php, je parviens bien à afficher ma vue HomeView.php
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]
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:
Voici ma classe Controller
Code : Sélectionner tout - Visualiser dans une fenêtre à part call_user_func_array([$this->controller, $this->action],$this->params);
puis ma classe HomeController
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; } }
Ma classe view
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 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 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'; } } }
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
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; } } }
Auriez vous la gentillesse de bien vouloir m'aider SVP ?
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'; ?>
En espérant avoir été assez précis, je vous remercie par avance de votre aide.
Bonne journée
Partager