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
Réponse acceptée

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 :)

Bonsoir,

quelle est la structure de ton application (arborescence) ?

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

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

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;

    }