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 :)
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 :)
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'
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
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.
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
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');
}
}
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();
c'est toujours la meme erreur quand je change
Core\Autoloader::register();
par
\Core\Autoloader::register();
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 !!
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;
}