IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Classes non trouvées


Sujet :

Langage PHP

  1. #1
    Débutant   Avatar de FCL31
    Profil pro
    Inscrit en
    Août 2007
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 885
    Points : 267
    Points
    267
    Par défaut Classes non trouvées
    Bonjour.
    Je me fais une petite appli web mais j'ai des erreur comme quoi un fichier ne trouve pas les classes nécessaire.

    PHP 8.2.13
    Apache 2.4.58
    Wamp 3.3.2



    j'ai mon fichier index.php à la racine du site :
    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
    <?php
     
    use Config\Router;
    use Config\DatabaseConnection;
     
     
    require_once 'vendor/autoload.php';
     
     
    // Chargement de la configuration de la base de données
    $config = require_once 'config/database.php';
     
     
    // Connexion à la base de données
    $database = new DatabaseConnection($config['host'], $config['dbname'], $config['username'], $config['password']);
    $pdo = $database->connect();
     
     
    // Utilisation du PDO pour créer un objet Router
    $router = new Router('config/routes.yaml');
    $router->route($_SERVER['REQUEST_URI']);
    J'ai un message 'Erreur Fatale' me signifiant ne pas trouver les classes 'DatabaseConnection' et 'Router'
    Pourtant, elles existent

    config\DatabaseConnection.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// Database.php
     
     
    namespace Config;
     
     
    use PDO;
    use PDOException;
     
     
    class DatabaseConnection {
        private $host;
        private $dbname;
        private $username;
        private $password;
        private $pdo;
     
    //...
    config\Router.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
    <?php
    // config/Router.php
     
     
    namespace Config;
     
     
    use Symfony\Component\Yaml\Yaml;
     
     
    class Router {
        private $routes;
     
     
        public function __construct($routesFile) {
            $this->routes = Yaml::parseFile($routesFile);
        }
     
    // ...
    J'ai beau chercher le problème au niveau de la casse, les chemin d'accès, les namespace, relancer le serveur (wamp).

    J'ai aussi essayé composer dump-autoload et composer install.

    Si ça peut aide, l'arborescence du site :
    Nom : image_2024-02-11_233112448.png
Affichages : 161
Taille : 13,5 Ko




    Help me pls.

    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Bonjour,

    Quel est le contenu de ton fichier composer.json pour la configuration de l'autoload ?

    Par défaut, l'autoload de composer utilise PS4. Ton fichier composer.json doit définir ton "vendor namespace" et le dossier de tes sources :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {
        "autoload": {
            "psr-4": {"MonProjet\\": "src/"}
        }
    }
    -> Ici mon "vendor namespace" est MonProjet et il est lié au dossier src à la racine du projet.

    Les classes du projet doivent être dans le dossier src et les espaces de nom des classes doivent correspondre aux sous-dossiers :
    - la classe MonProjet\MaClasse doit se situer dans mon-projet/src/MaClasse.php
    - la classe MonProjet\Config\Router doit se situer dans le dossier mon-projet/src/Config/Router.php

    https://getcomposer.org/doc/01-basic...md#autoloading
    https://www.php-fig.org/psr/psr-4/

  3. #3
    Débutant   Avatar de FCL31
    Profil pro
    Inscrit en
    Août 2007
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 885
    Points : 267
    Points
    267
    Par défaut
    Merci pour ton retour.
    j'ai modifier un peur la structure du site :
    Nom : image_2024-02-12_161051619.png
Affichages : 124
Taille : 15,6 Ko

    Mon fichier composer.json :
    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
    {    "name": "flow/test",
        "description": "Projet test",
        "type": "project",
        "require": {
            "twig/twig": "^3.0",
            "symfony/yaml": "^6.0"
        },
        "autoload": {
            "psr-4": {
                "Config\\": "src/Config",
                "Controllers\\": "src/Controllers",
                "Models\\": "src/Models",
                "Views\\": "src/Views"
            }
        }
    }
    Mon fichier Router.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
    33
    34
    35
    <?php// src/Config/Router.php
     
     
    namespace Config;
     
     
    use Symfony\Component\Yaml\Yaml;
     
     
    class Router {
        private $routes;
     
     
        public function __construct($routesFile) {
            $this->routes = Yaml::parseFile($routesFile);
        }
     
     
        public function route($uri) {
            foreach ($this->routes['routes'] as $route) {
                if ($route['path'] === $uri && in_array($_SERVER['REQUEST_METHOD'], $route['methods'])) {
                    $controllerInfo = explode('::', $route['controller']);
                    $controllerClass = 'Controllers\\' . $controllerInfo[0];
                    $controllerMethod = $controllerInfo[1];
                    $controller = new $controllerClass();
                    return $controller->$controllerMethod();
                }
            }
            // Si aucune route ne correspond, afficher une page 404 ou rediriger vers une page d'erreur
            header("HTTP/1.0 404 Not Found");
            echo '404 - Page not found';
            exit;
        }
    }
    }
    mon fichier routes.yaml
    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    routes:  home:
        path: /
        controller: HomeController
        action: index
        method: [GET]

    Les models ont le namespace : namespace Src\Models;
    Les controllers ont le namespace : namespace Src\Controllers;

    le fichier public/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
    <?php
     
    use Src\Config\Router;
    use Src\Config\DatabaseConnection;
     
     
    require_once 'vendor/autoload.php';
     
     
    // Chargement de la configuration de la base de données
    $config = require_once 'config/database.php';
     
     
    // Connexion à la base de données
    $database = new DatabaseConnection($config['host'], $config['dbname'], $config['username'], $config['password']);
    $pdo = $database->connect();
     
     
    // Utilisation du PDO pour créer un objet Router
    $router = new Router('config/routes.yaml');
    $router->route($_SERVER['REQUEST_URI']);
    Maintenant, l'url'/' du site affiche :
    Nom : efe.png
Affichages : 122
Taille : 57,1 Ko


    Merci d'avance

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    si le fichier est bien config\DatabaseConnection.php, tu tentes d'uploader un autre : $config = require_once 'config/database.php';. Néanmoins, cet import doit être inutile vu l'autoload de composer...

    Bienvenu les vieux débutants
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  5. #5
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Le premier intérêt des espaces de nom est d'avoir des noms de classe uniques afin d'éviter les conflits.
    Si je crée ma classe Config\Router dans mon projet, je ne pourrai pas l'utiliser avec ton projet car il y aura un conflit entre nos deux classes avec le même nom.

    Il faut définir un seul vendor namespace dans ton fichier composer.json, par convention on utilise le nom du projet avec éventuellement le nom de l'auteur.
    Si ton projet se nomme Toast (pour changer de "TEST"), tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "psr-4": {"Toast\\": "src/"}
    Si tu choisis "Toast" comme vendor namespace, toutes les classes de ton projet dans le dossier src doivent être déclarée dans le namespace Toast.
    Attention à la casse des dossiers (Config à la place de config, Models à la place de models, etc.)

    composer.json
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    {
       "name":"flow/test",
       "description":"Projet test",
       "type":"project",
       "require":{
          "twig/twig":"^3.0",
          "symfony/yaml":"^6.0"
       },
       "autoload":{
          "psr-4":{
             "Toast\\":"src/"
          }
       }
    }
    src/Config/Router.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php 
     
    namespace Toast\Config;
     
    class Router {}
    public/index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    require_once '../vendor/autoload.php';
     
    use Toast\Config\Router;
    use Toast\Config\DatabaseConnection;
     
    // ...

    Concernant la racine de ton site dans le navigateur, il faut modifier le DocumentRoot de ton virtual host Apache afin que celui-ci pointe sur le dossier public de ton projet.
    Est-ce que tu as créé un nouveau virtualhost dans Wamp pour ton projet ?
    Ou est-ce que tu utilises celui par défaut (les fichiers de ton projet sont dans le dossier www par défaut) ?

  6. #6
    Débutant   Avatar de FCL31
    Profil pro
    Inscrit en
    Août 2007
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 885
    Points : 267
    Points
    267
    Par défaut
    Déjà, merci pour vos retour.

    j'ai apporté des modifications proposées.
    J'ai toujours le message 'Erreur Fatale' me signifiant ne pas trouver les classes 'DatabaseConnection' et 'Router'
    Pourtant, elles existent si je vais sur el nom-du-site/public/index


    Est-ce que tu as créé un nouveau virtualhost dans Wamp pour ton projet ?
    Ou est-ce que tu utilises celui par défaut (les fichiers de ton projet sont dans le dossier www par défaut) ?
    J'utilise celui par défaut je sais pas quoi ni ou il faut configurer pour que que le lien de la racine du site soit rediriger vers 'public/index' .

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par FCL31 Voir le message
    J'utilise celui par défaut je sais pas quoi ni ou il faut configurer pour que que le lien de la racine du site soit rediriger vers 'public/index' .
    Je suis loin d'être un spécialiste mais je vois 2 possibilités :
    1. .htaccess (sûrement le mieux mais j'y connais rien)
    2. redirection PHP : si dans la racine, tu as un fichier index.php, tu mets dedans ce code :
      Code php : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      header("Location: public/index.php");
      exit();
      mais ce code ne marchera que si y a aucun code qui part vers le navigateur avant lui (donc pas de html, même pas un espace...)
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Tu devrais facilement trouver des guides sur l'utilisation des vhosts dans WampServer, voir par exemple :
    http://forum.wampserver.com/read.php?1,161036

    Impossible de t'aider à corriger ton erreur sans voir le code modifié.
    Essaye de repartir sur une base simple et de procéder par étape, tu peux consulter n'importe quel package php sur Github pour comparer avec ton projet.
    Par exemple, regarde le squelette proposé par Grunk sur ce forum qui ressemble à ton test : https://www.developpez.net/forums/d2...te-projet-php/

  9. #9
    Débutant   Avatar de FCL31
    Profil pro
    Inscrit en
    Août 2007
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 885
    Points : 267
    Points
    267
    Par défaut
    Bon,

    Même avec un Virtual Host, j'ai le même problème.

    Comme ca me soule j'ai laissé ce code de coté et j'ai refait en utilisant le serveur interne à php.

    J'ai encore des problèmes : erreur 404 qui me renvoi quand même sur une vue 404.twig que j'ai fait

    Mais cela ferra l'affaire d'un nouveau post (sauf si j'arrive à trouver le problème)

    Merci a tous

Discussions similaires

  1. Class non trouvé - classnotfoundexception
    Par c-bolo dans le forum Spring
    Réponses: 8
    Dernier message: 06/09/2010, 16h05
  2. Erreur de classe non trouve sur différents projets
    Par X-plode dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 27/11/2008, 16h23
  3. Probleme de deploiement d'EJB (Classe non trouvé)
    Par hbellahc dans le forum Websphere
    Réponses: 1
    Dernier message: 14/08/2008, 13h44
  4. class non trouvé
    Par robert_trudel dans le forum Langage
    Réponses: 1
    Dernier message: 04/12/2006, 23h07
  5. Classe non trouvé TWebBrowser
    Par Aloneghost dans le forum Web & réseau
    Réponses: 1
    Dernier message: 18/04/2006, 20h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo