Autoloading

Par José Amani, il y a 11 ans


Salut a tous voila j'ai suivi le tuto de grafikart mais je suis bloque au niveau du refactoring car mon autoloader sinon mes autoloader bug voila l'erreur qui m'est afficher

Warning: require(E:\EasyPHP\data\localweb\dev.lab\app/Core\Table\Table.php): failed to open stream: No such file or directory in E:\EasyPHP\data\localweb\dev.lab\app\Autoloader.php on line 26

Fatal error: require(): Failed opening required 'E:\EasyPHP\data\localweb\dev.lab\app/Core\Table\Table.php' (include_path='.;C:\php\pear') in E:\EasyPHP\data\localweb\dev.lab\app\Autoloader.php on line 26

le code de mon fichier App

<?php use Core\Config; use Core\Database\MysqlDatabase; class App{ private static $_instance; private $db_instance; public $title = 'mon super site'; public static function getInstance(){ if (is_null(self::$_instance)) { self::$_instance = new App(); } return self::$_instance; } public function getTable($name){ $class_name = '\\App\\Table\\'.ucfirst($name).'Table'; return new $class_name($this->getDb()); } public function getDb(){ $config = Config::getInstance(ROOT .'/config/comfig.php'); if (is_null($this->db_instance)) { $this->db_instance = new MysqlDatabase($config->get('db_name'),$config->get('db_user'),$config->get('db_pass'),$config->get('db_host')); } return $this->db_instance; } public static function load(){ session_start(); require ROOT.'/app/Autoloader.php'; App\Autoloader::register(); require ROOT.'/core/Autoloader.php'; Core\Autoloader::register(); } }

merci pour votre aide :)

12 réponses

connected, il y a 11 ans

Bonsoir,

quelle est la structure de ton application (arborescence) ?

Spiker, il y a 11 ans

Au premier coup d'oeil, je pense que tu a un problème avec tes slash/antislash:
Fatal error: require(): Failed opening required 'E:\EasyPHP\data\localweb\dev.lab\app/Core \ Table \ Table.php'

José Amani, il y a 11 ans

la structure de mon aborescescence est la suivante :

-dossier principal -app -config -Table ArticlesTable.php App.php Autoloader.php -config config.php - core - Database Database.php MysqlDatabase.php - Table Table.php Autoloader.php Config.php - pages - Templates default.php 404.php home.php categorie.php -public -css -js index.php
connected, il y a 11 ans

Si l'indentation est correct, le répertoire core se trouve sous /app/core ?

Pourtant tu charges dans ta methode load() :

<?php require ROOT.'/core/Autoloader.php';

Aussi pour rebondir sur la réponse de Spiker, windows est très permissif il arrive a faire le chemin même si on melange les slashs et antislashs. Je conseil toujours d'utiliser DIRECTORY_SEPARATOR au lieu du slash :

<?php define('DS', DIRECTORY_SEPARATOR);

Sur windows il faut aussi faire attention aux minuscules et majuscules dans les noms de répertoire et fichier. Car il n'est pas casse sensitive, le passage sur Linux peut-être difficile.

José Amani, il y a 11 ans

OK merci pour ton aide core est en dehors de app pas dans le meme dossier aussi j'ai utiliser

define('DS', DIRECTORY_SEPARATOR);

mais j'ai toujour le meme probleme

connected, il y a 11 ans

Peux tu nous montrer ton Autoloader pour le core, ainsi que ta classe Table sous core ?

José Amani, il y a 11 ans

code de l'autoloading pour le core :

namespace Core; class Autoloader{ /** * Enregistre notre autoloader */ static function register(){ spl_autoload_register(array(__CLASS__, 'autoload')); } /** * Inclue le fichier correspondant à notre classe * @param $class string Le nom de la classe à charger */ static function autoload($class){ if (strpos($class,__NAMESPACE__.'\\')===0){ $class = str_replace(__NAMESPACE__.'\\','',$class); $class = str_replace('\\','/',$class); } // echo __DIR__; exit; require __DIR__ . '/' . $class . '.php'; } }

code de la classe table dans le core :

namespace Core\Table; use Core\Database\Database; class Table{ protected $table ; protected $db; public function __construct(Database $db){ $this->db = $db; if (is_null($this->table)) { $parts = explode('\\',get_class($this)); $class_name = end($parts); $this->table = strtolower(str_replace('Table', '', $class_name)); } } public function all(){ return $this->db->query('SELECT * FROM articles'); } }
connected, il y a 11 ans

Re,

j'ai réussi à reproduire l'erreur chez moi, donc j'en conclu que si l'autoloader App n'arrive pas à trouver le fichier il plante et s'arrête... Du coup j'ai changé le code de l'autoloader (app et core) :

<?php static function autoload($class){ if (strpos($class,__NAMESPACE__.'\\')===0){ $class = str_replace(__NAMESPACE__.'\\','',$class); $class = str_replace('\\','/',$class); } $file = __DIR__ . '/' . $class . '.php'; if(is_readable($file)){ require $file; } // echo __DIR__; exit; }

Ça fonctionne de mon côté, tiens moi au courant :)

connected, il y a 11 ans

Ok merci, en regardant les erreurs on constate qu'il essaye de charger /app/Core/Table/Table.php.
Qu'est ce que ca donne si tu changes dans ta méthode load() de App :

<?php Core\Autoloader::register();

par

<?php \Core\Autoloader::register();
José Amani, il y a 11 ans

c'est toujours la meme erreur quand je change

Core\Autoloader::register();

par

\Core\Autoloader::register();
connected, il y a 11 ans

D'accord,

j'ai essayé de reproduire l'erreur chez moi en local, je pense que ton soucis viens de ton appel à ta Table. Peux-tu nous donner la valeur de $class_name dans la methode getTable(), juste avant le return ?

On va y arriver !!

José Amani, il y a 11 ans

Merci connected on y est arrivé j'ai changer l'autoloader de app et core
et ca marche super bien !!!!

static function autoload($class){ if (strpos($class,__NAMESPACE__.'\\')===0){ $class = str_replace(__NAMESPACE__.'\\','',$class); $class = str_replace('\\','/',$class); } $file = __DIR__ . '/' . $class . '.php'; if(is_readable($file)){ require $file; } // echo __DIR__; exit; }