Bonjour,
Je me permets de revenir avec mon problème rencontré en suivant la formation sur la POO (chapitre18).
Nous séparons donc le core de notre application de notre application proprement dite. Nous créons dans la class App une fonction load supposée chargée les deux autoloaders, celui de app et celui de du core.
Dans mon cas il n'y a jamais qu'un seul autoloader qui est chargé.
Du coup soit l'autolaoder core tente de chargé la Class PostsTable dans core\Table, soit l'autoloader de App cherche la class mère Table dans app\Core\Table au lieu de dans core\Table.

On m'avait mis sur une voie en pensant que la fonction getTable était mal écrite du point de vue du chemin. Mais réflexion faite non celle-ci doit toujours chercher une Class fille Table (usersTable, categoriesTable) dans app\Table mais ces dernières appellent core\Table\Table. A ce moment là on dirait que l'application ne sait pas qu'elle doit utiliser l'autoloader du Core.

Certain me diront p-ê d'utliser les sources et de passer au chapitre suivant mais ça m'énerve trop de ne pas trouver d'où viens le problème.

Dans la fonction load quand je require d'abord l'autoloader de app, j'obtiens une erreur

require(C:\xampp\htdocs\Lab\BlogPOO\app\Core\Table\Table.php): failed to open stream

Quand je require d'abord l'autoloader du core j'obtiens:

Warning: require(C:\xampp\htdocs\Lab\BlogPOO\core\App\Table\PostsTable.php): failed to open stream:  

Merci d'avance pour votre aide

<?php
// $ public/index.php
define ('ROOT', dirname(__DIR__));
require  ROOT . '/app/App.php';
require ROOT.'/core/functions.php'; // debug function
App::load();

$app = App::getInstance();
$posts = $app->getTable('Posts');
//var_dump($posts->all());
<?php
// $ app/App.php
use Core\Config;
use Core\Database\MysqlDatabase;

class App
{
    public $title = "Blog";
    private $db_instance;
    private static $_instance;

    public static function getInstance()
    {
        if (is_null(self::$_instance)){
            self::$_instance = new App();
        }
        return self::$_instance;
    }

    public static function load()
    {
        session_start();
        require ROOT . '/app/Autoloader.php';
        App\Autoloader::register();
        require ROOT . '/core/Autoloader.php';
        Core\Autoloader::register();
    }

    public function getTable($name)
    {
        $class_name = '\\App\\Table\\' . ucfirst($name) . 'Table';
        //debug($class_name);
        return new $class_name($this->getDb());
    }

   public function getDb()
    {
        $config = Config::getInstance(ROOT . '/config/config.php');
        if ($this->db_instance === null){
            $this->db_instance =  new MysqlDatabase($config->get('db_name'), $config->get('db_user'), $config->get('db_pass'), $config->get('bd_host'));
        }
        return $this->db_instance;
    }
    <?php
// $ app/Table/PostsTable.php

namespace App\Table;

use Core\Table\Table;

class PostsTable extends Table
{
    protected $table = "articles";

}

5 réponses


bibi427
Auteur
Réponse acceptée

@ADessi: effectivement par la suite utiliser l'autoloading de Composer sera plus simple mais comme le disait betaWab il s'agit ici de suivre la formation en POO ;)
@ betaWeb: J'ai eu quelques petits soucis en voulant revenir en arrière avec git. J'ai eu quelques conflits et j'ai mal géré le bazar. Du coup j'ai perdu une bonne partie du code qui semblait poser problème. Et en fait bien m'en a pris :)
N'écoutant que mon courage :D je me suis dis "Bon bin vas y reprends le TP depuis le début". Et voilà, je suis arrivé au même point et tout fonctionne :)))
Ce n'était pas un problème de code à proprement parler. Mais comme on le dis souvent le problème se situait bien entre le dossier de la chaise et l'écran :D
il semble que c'était mon IDE qui s'occupait de l'autoloading et non ceux que je tentais de charger. Je sais qu'à un certain moment j'ai vu un message du type [
Detect PSR-0 namespace roots
New PSR-0 namespace root was detected. Do you want to mark the following directory as namespace root?
] de mon IDE et que j'ai eut la bonne idée de marquer le dossier app comme namespace root. ^^
Merci en tout cas de d'être proposé.
Je vais pouvoir aller de l'avant :)

Salut,

Tu n'aurais pas un problème de permissions sur les fichiers en question ?

bibi427
Auteur

Vérification faite tous les fichiers sont au même niveau d'accèssibilité et d'autorisation ?

Utilise l'autoloader de Composer, de toute manière tu seras un jour ou l'autre amené à utiliser une librairie tierce.

@ADessi hors sujet il s'agit ici d'un soucis lié à la formation POO disponible sur le site, rien à voir avec Composer.
@bibi427 Peux-tu c/c l'erreur en entier stp ?