Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/08/2025, à 07:53

Xahendir

problème d'autoloader et de chemin de classe en localhost

Bonjour,

J'espère que je suis au bon endroit, parce que mon problème a lieu alors que je suis encore entrain de bâtir l'architecture d'un site et de le tester en localhost.

Je suis un tuto (sur le site Grafikart) pour essayer d'obtenir un site très simple qui permet d'afficher des photos dont les propriétés sont stockées dans une base de données. Pour ça, j'ai besoin de générer quelques URL simple :
- /site pour l'acceuil,
- /site/photo pour afficher les dernières photos ajoutées,
- /site/photo/[id] pour une photo en particulier ....

J'utilise PHP 8.4.10.
Le dossier de développement est /var/www/html/SitePlantes/
L'URL du site est http://localhost:8000/


Tant que je ne crée pas de classe personnelle, le router fonctionne :

$router = new AltoRouter('vues');
define('VIEW_PATH', 'vues');

$router->map('GET', '/site', function() {
    require VIEW_PATH . '/photo/index.php';
});

$router->map('GET', '/lieu', function() {
    require VIEW_PATH . '/lieu/show.php';
});

$match = $router->match();
$match['target']();

En suivant, le tutoriel j'essaie d'utiliser une classe Router (fichier /var/www/html/SitePlantes/public/src/Router.php) :

<?php
namespace App;

class Router {

    /**
     * @var string
     */
    private $viewPath;

    /**
     * @var AltoRouter
     */
    private $router;

    public function __construct(string $viewPath)
    {
        $this->viewPath = $viewPath;
        $this->router = new \AltoRouter();
    }

    public function get(string $url, string $view, ?string $name = null): self
    {
        $this->router->map('GET', $url, $view, $name);

        return $this;
    }

    public function run(): self
    {
        $match = $this->router->match();
        $view = $match['target'];
        ob_start();
        require $this->viewPath . $view . '.php';
        $content = ob_get_clean();
        require $this->viewPath . 'layouts/default.php';

        return $this;
    }
}

Et mon composer :

{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "require": {
        "altorouter/altorouter": "1.2.0",
        "symfony/var-dumper": "^4.2",
        "filp/whoops": "2.3.1",
        "fzaninotto/faker": "1.8.0"
    }
}

Quand j'essaie d'accéder à http://localhost:8000/site j'ai une erreur :

Il semble y avoir un problème sur ce site

Il est possible que http://localhost:8000/site connaisse un problème temporaire ou ait été déplacé.

Code d’erreur : 500 Internal Server Error

    Le site est peut-être temporairement indisponible ou surchargé. Réessayez plus tard ;

Et dans mon terminal j'ai ça :

~$ cd /var/www/html/SitePlantes
/var/www/html/SitePlantes$ php -S localhost:8000 -t public
[Mon Aug  4 07:40:38 2025] PHP 8.4.10 Development Server (http://localhost:8000) started
[Mon Aug  4 07:41:36 2025] 127.0.0.1:48482 Accepted
[Mon Aug  4 07:41:36 2025] PHP Fatal error:  Uncaught Error: Class "App\Router" not found in /var/www/html/SitePlantes/public/index.php:8
Stack trace:
#0 {main}
  thrown in /var/www/html/SitePlantes/public/index.php on line 8
[Mon Aug  4 07:41:36 2025] 127.0.0.1:48482 [500]: GET /site - Uncaught Error: Class "App\Router" not found in /var/www/html/SitePlantes/public/index.php:8
Stack trace:
#0 {main}
  thrown in /var/www/html/SitePlantes/public/index.php on line 8
[Mon Aug  4 07:41:36 2025] 127.0.0.1:48482 Closing

Au passage, chaque fois que j'ai une erreur PHP, le serveur plante complètement, ce qui me force à rouvrir un terminal et à relancer le serveur. Ce n'est pas possible d'éviter ça ?

Donc je comprends bien que la classe Router n'est pas trouvée, mais je ne comprends pas pourquoi elle n'est pas trouvée : est-ce que c'est parce que le tuto a des années et que dans ma version de PHP je dois déclarer l'autoload autrement ?
Parce que je ne trouve pas le retour du terminal très explicite : tout ce que je comprends c'est que quand j'essaie d'accéder à la classe Router elle n'est pas trouvée, mais je n'ai pas le chemin auquel elle a été cherchée, pour comparer au chemin auquel elle se trouve.

Merci d'avance.

Hors ligne

#2 Le 04/08/2025, à 14:27

Vobul

Re : problème d'autoloader et de chemin de classe en localhost

J'ai l'impression qu'il te manque un "require_once __DIR__ . '/../vendor/autoload.php';" quelque part.

Mais sinon évite les vieux tuto PHP random de sites foireux. Vu que tu débutes, tu peux prendre un framwork simple genre https://www.slimframework.com/ et tu RTFM et tu devrais t'en sortir.


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#3 Le 05/08/2025, à 09:40

Xahendir

Re : problème d'autoloader et de chemin de classe en localhost

Je vais tester ça, parce qu'effectivement je n'ai pas souvenir de l'avoir fait.

Comme c'est pour un site non-mis en ligne, je fais une version en php ancien / brut / moche tant que j'ai le temps et une fois que je serai sûr que cette version de démo convient, je m'assurerai de faire un truc plus à jour et plus propre (quand j'aurai le temps de m'y consacrer).

Hors ligne

#4 Le 05/08/2025, à 10:32

iznobe

Re : problème d'autoloader et de chemin de classe en localhost

Quand j'essaie d'accéder à http://localhost:8000/site j'ai une erreur :
...

Et dans mon terminal j'ai ça :

~$ cd /var/www/html/SitePlantes
....

deja , faudrait commencer par taper la bonne adresse dans ton navigateur .


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne