Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur appel constructeur après hébergement

Sujet résolu
    18 mai 2022 à 11:58:25

    Bonjour,

    Je souhaite héberger un site web chez OVH. Il est développé autour d'un framework MVC "maison". Je dois donc appeler différents controllers pour le bon fonctionnement du site.

    Voilà le morceau de code permettant de faire cela

    $controllerName = HttpHelper::getParam('controller') ?: 'Home';
    $controllerQualifiedName = "controllers\\" . $controllerName . "Controller";
    
    if(!file_exists($controllerQualifiedName . ".php")) { header('Location: 404.php'); exit; } $controller = new $controllerQualifiedName();

    En résumé, ce morceau de code permet d'appeler le constructeur d'un controller (par défaut : HomeController)

    Les namespaces sont bien respectés.

    (la fonction getParam permet de récupérer des valeurs des variables $_POST et $_GET)

    Tout fonctionne parfaitement bien en local mais une fois hébergé, il ne trouve plus la class en question. Donc je suis renvoyé sur la page 404.php.

    Si j'enlève ce contrôle, j’obtiens l'erreur suivante.


    Fatal error: Uncaught Error: Class "controllers\HomeController" not found in /home/aveyror/www/yasmf/router.php:32 Stack trace: #0 /home/aveyror/www/index.php(17): yasmf\Router->route(Object(yasmf\DataSource)) #1 {main} thrown in /home/aveyror/www/yasmf/router.php on line 32

    J'ai la même arborescence en local qu'une fois hébergé (à partir du dossier www).

    Je précise que c'est la première fois que j'héberge un site. J'ai souscrit à une offre pro2014 chez OVH. Peut-être qu'il y a une configuration spéciale à effectuer mais, je n'ai rein trouvé de tel.



    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2022 à 12:31:17

      Salut

      Tu ne serais pas sous Windows en local ?

      Est-ce que tu n'as pas des différences de casse entre les fichiers et les espaces de noms ?

      • Partager sur Facebook
      • Partager sur Twitter
        18 mai 2022 à 13:03:10

        Oui je suis sous Windows en local.

        Pour les namespaces, j'ai bien fait attention de les mettre tous en minuscule. Pour les controllers, c'est la première lettre en majuscule de chaque mot. Par contre j'ai essayé de remplacer le "\" par un "/" dans le bout de code, mais ça ne marche pas même en local. Je n'ai pas réussi à savoir s'il s'agissait d'une erreur de syntaxe PHP ou toujours le même problème.



        • Partager sur Facebook
        • Partager sur Twitter
          18 mai 2022 à 13:06:03

          Je parle bien des dossiers niveau OS, pas de ceux des espaces de nom. Là où Windows se débrouille pour faire en sorte que l'espace de nom Truc corresponde au dossier truc (ou inversément), sous Unixoïde, ça posera problème.

          A noter que normalement, sous Windows comme sous Unix, avec les versions récentes de PHP, tu peux utiliser / au lieu de \\ sans autre, c'est portable.

          • Partager sur Facebook
          • Partager sur Twitter
            18 mai 2022 à 13:13:40

            Tous les dossiers sont en minuscule et sans espace. Pour les slashs je crois avoir compris, mais ça ne résout pas mon problème.
            • Partager sur Facebook
            • Partager sur Twitter
              18 mai 2022 à 13:17:20

              Alors temporairement affiche les différentes variables pour tenter de voir ce qui pose problème.

              Je me suis trompé, les \\ que tu as mis sont pour l'espace de noms, donc c'est le bon caractère. En revanche, cela n'est plus le bon pour le chemin, où sous Unix il faut /. Il va te falloir séparer le chemin du fichier de l'espace de nom, du simple fait de cette différence de caractères.

              • Partager sur Facebook
              • Partager sur Twitter
                18 mai 2022 à 13:26:43

                Toujours la même erreur :

                Fatal error: Uncaught Error: Class "controllers\HomeController" not found in /home/aveyror/www/yasmf/router.php:36 Stack trace: #0 /home/aveyror/www/index.php(17): yasmf\Router->route(Object(yasmf\DataSource)) #1 {main} thrown in /home/aveyror/www/yasmf/router.php on line 36

                $controllerName = HttpHelper::getParam('controller') ?: 'Home';
                $controllerQualifiedName = "controllers\\" . $controllerName . "Controller";
                $controllerPath = "controllers/" . $controllerName . "Controller";
                
                if(!file_exists($controllerPath . ".php")) {
                            header('Location: 404.php');
                            exit;
                        }
                $controller = new $controllerQualifiedName()


                C'est un peu mieux, il trouve le fichier mais toujours pas la class

                • Partager sur Facebook
                • Partager sur Twitter
                  18 mai 2022 à 13:37:22

                  Elle est chargée où/comment/par qui cette classe ?

                  Il y a moyen de nous donner un screen montrant les fichiers et répertoires de ton arborescence ? (commande tree de Windows au pire ?)

                  Pour $controllerPath tu peux faire un str_replace de \ par / de $controllerQualifiedName.

                  -
                  Edité par julp 18 mai 2022 à 13:44:08

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 mai 2022 à 13:43:17

                    Elle est chargée par ce router qui se trouve dans le namespace et dossier "yasmf"

                    La class est dans un dossier "controllers" au même niveau que "yasmf"

                    -
                    Edité par Killian611 18 mai 2022 à 13:46:46

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 mai 2022 à 14:07:49

                      Il faudrait voir l'autoloader parce que sauf s'il met le nom de la classe en minuscules pour trouver le nom du fichier, PHP ne devrait pas être capable de trouver httphelper vu qu'il est écrit HttpHelper. Ou alors il est écrit en minuscules plus tôt dans le code/sa première occurrence.

                      Comment sont déclarées les classes httphelper et HomeController ? (la ligne class ...)

                      -
                      Edité par julp 18 mai 2022 à 14:08:30

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 mai 2022 à 14:14:10

                        D'accord, mais en l’occurrence, ici il recherche la class HttpHelper, le nom du fichier aurait un impact ?

                        Voilà  directement toute la class HttpHelper

                        namespace yasmf;
                        
                        use Exception;
                        
                        class HttpHelper
                        {
                            public static function getParam($name) {
                                if (isset($_GET[$name])) return $_GET[$name];
                                if (isset($_POST[$name])) return $_POST[$name];
                                return null;
                            }
                        }

                        Et l'en tête du HomeController

                        namespace controllers;
                        
                        use yasmf\View;
                        use models\modelHome;
                        
                        class HomeController {
                        
                        ...
                        
                        }




                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 mai 2022 à 14:20:51

                          > le nom du fichier aurait un impact ?

                          Comme l'a dit Ymox, c'est plus que probable : "par défaut" (dans les faits c'est plus fonction du système de fichiers que véritablement de l'OS), Windows est insensible à la casse quand les Unixoïdes y sont sensibles (du moins historiquement). Il peut aussi y avoir la différence de séparateur / vs \ qui peut jouer.

                          Prenons le fichier HomeController.php pour exemple et partons du principe que l'autoloader reprend le nom de la classe telle quelle :

                          • pour Windows : dans ton code que tu écrives new homecontroller (fichier cherché : homecontroller.php) ou new HomeController (fichier : HomeController.php), il trouvera le fichier car les 2 mènent à HomeController.php
                          • en revanche sous Unixoïde c'est totalement différent : au contraire de Windows, homecontroller.php et HomeController.php désignent 2 fichiers distincts donc si l'autoloader ne cherche pas le bon, PHP ne trouvant pas la classe, tu te retrouves avec une erreur comme la tienne

                          Après ça dépend de l'autoloader, ce qu'il fait, les traitements qu'il applique ou non au nom de la classe à charger pour déterminer le nom du fichier qui devrait correspond à celui de la classe.

                          Si tu renommes, pour tester, HomeController.php en homecontroller.php ? (implique de commenter temporairement le test file_exists)

                          -
                          Edité par julp 18 mai 2022 à 14:28:08

                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 mai 2022 à 14:31:11

                            C'était donc ça ! Je ferrais attention à ça maintenant. Merci beaucoup pour votre aide en tout cas :)
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Erreur appel constructeur après hébergement

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown