Bonjour à tous

J'ai créer un routeur pour définir mes url

<?php

use Router\Router;

require '../vendor/autoload.php';

define('VIEWS', dirname(__DIR__) . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR );
define('SCRIPTS', dirname($_SERVER['SCRIPT_NAME']) . DIRECTORY_SEPARATOR);

$router = new Router($_GET['url']); 

$router->get('/', 'App\Controllers\BlogController@welcome');
$router->get('/posts', 'App\Controllers\BlogController@index');

$router->get('/posts/:id', 'App\Controllers\BlogController@show');

// Ajouter un article
$router->get('/ajouter', 'App\Controllers\BlogController@ajouter');
$router->post('/ajouter', 'App\Controllers\BlogController@ajouter');

$router->run();

Hors quand je le url simplifier avec /posts j'ai une erreur 404 , avez vous d'où peux venir mon soucis .

J'ai aussi mon layout qui ne s'affiche pas sur certaine page.

<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Mon super site</title>
  <link rel="stylesheet" href="<?= SCRIPTS . 'css' . DIRECTORY_SEPARATOR . 'app.css' ?>">
 </head>
<body>

<nav class="navbar navbar-expand-lg bg-body-tertiary">
  <div class="container-fluid">
    <a class="navbar-brand" href="">Immobillier </a>
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav me-auto mb-2 mb-lg-0">
        <li class="nav-item">
          <a class="nav-link active" aria-current="page" href="/">Accueil</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="/posts">Les derniers articles</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="views/blog/ajouter.php">Ajouter une annonce</a>
        </li>

      </ul>
      <form class="d-flex" role="search">
        <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
        <button class="btn btn-outline-success" type="submit">Rechercher</button>
      </form>
    </div>
  </div>
</nav>

<div class="container">
<?= $content ?>
</div>

</body>
</html>

4 réponses


Bonjour,
Il faudrait que tu nous montres ton fichier qui contient ta classe 'Router' dans un premier temps pour pouvoir savoir ce qu'il fait.
J'imagine qu'il retourne bien ton fichier correspondant au chemin de ta requête dans l'URL.

As tu bien une méthode index dans ton fichier posts.php ?

il faut qu'on puisse voir :
ton fichier router
ton fichier BlogController
l'URL que tu lui passes qui te donne cette erreur

Bonjour et merci pour ta reponse

La fichier Router.php

<?php 

namespace Router;
class Router{

  public $url;
  public $routes = [];
  public function __construct($url)
  {
     $this->url = trim($url, '/');
  }
  public function get(string $path, string $action ){

    $this->routes['GET'][] = new Route($path, $action);
   }
  public function post(string $path, string $action ){

    $this->routes['POST'][] = new Route($path, $action);
   }
  public function run(){

    foreach($this->routes[$_SERVER['REQUEST_METHOD']] as $route) {

      if  ($route->matches($this->url)){
           return $route->execute();
      }
    }
  return header('HTTP/1.0 404 Not Found');
  }
}

Voila mon fichier blogController.php

<?php 

namespace App\Controllers;

class BlogController extends Controller {

  public function welcome(){

    return $this->view('blog.welcome'); 

}
public function index(){

  $statement = $this->db->getPDO()->query('SELECT * FROM annonces ORDER BY created_at DESC  ');
  $posts = $statement->fetchAll();

    return $this->view('blog.index', compact('posts')); 

}

/// Function qui affiche les annonces de la bdd 
public function show(int $id){

  $statement = $this->db->getPDO()->prepare('SELECT * FROM annonces WHERE id = ? ');
  $statement->execute([$id]);
  $post = $statement->fetch();  
  return $this->view('blog.show', compact('post'));  
}

// Ajouter dans la table sql 

public function ajouter(){

  if (isset($_POST['save'])){

    $Title = $_POST['Title']; 
    $content = $_POST['content'];
    $created_at = $_POST['created_at']; 

   $statement =  $this->db->getPDO()->prepare("INSERT INTO annonces (Title, content, created_at) VALUES (:Title, :content, :created_at)");

   $statement->execute([ 'Title' => $_POST['Title'], 'content' => $_POST['content'], 'created_at' => $_POST['created_at']]);

   header("Location:   ");
  }
  return $this->view('blog.ajouter');  
}
}

L'url que je passe c'est '/'

C'est bon j'ai trouver, il fallait mettre " posts " à la place de " /posts "

Mais mtn sur certaines pages ça ne fonctionne pas