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.
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.
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.
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.
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.
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
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 ...)
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 {
...
}
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)
C'était donc ça ! Je ferrais attention à ça maintenant. Merci beaucoup pour votre aide en tout cas
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.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli