Bonjour,
Novice en la matière, je tiens tout d'abord à remercier ce site, Grafikart, qui est très bon je trouve, et cette communauté de développeur qui m'a déjà permis de trouver réponse à mes questions par la lecture de vos postes. Mais cette fois je me lance et pause ma question car je tourne en rond... Allé! "on est partie!"... (déformation d'apprentissage et d'heure de visio ;) )
Ayant regardé tous les sujets concernants cette problèmatique sur le forum je n'ai amlheureusement pas trouvé de réponse. En effet le problème est paru chez plusieurs d'entre nous à parrement... comme ce cas ici : https://www.grafikart.fr/forum/topics/21621.
Usant d'astuce de simplification (comme mettre Table.php avec les autres _?_Table.php spécifique, j'ai donc usé de var-dump et trouver une solution. J'ai fini par me connecter à mon fichier PostsTable.
Pour y parvenir j'ai coupé Core\Autoloder.php. J'ai fini par recréer le bon chemin dans App\Autoloder.php. Hors actuellement j'ai l'affichage suivant :
->Fatal error: Class '\App\Table\PostsTable' not found in C:\wamp64\www\BloG\app\App.php on line 29
Cependant, j'ai vérifier et revérifier mes namespaces et je ne comprends pas pourquoi il ne marche pas.
Envous remerciant tous de votre attention, ça fait déjà quelque heures que je suis dessus (oO)et je vois déjà le truc tout bête venir mais j'imagine que vous connaissez :D
voici les codes que j'ai fait : (App.php/Autoload.php/Table.php/PostsTable.php(dans cette ordre) :
//App.php
<?php
use Core\Config;
use Core\Database\MysqlDatabaseDatabase;
class App{
public $title = 'Mon super site';
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';
return new $class_name($this->getDb());
}
public function getDb(){
$config = Config::getInstance(ROOT . '/config/config.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;
}
}
?>
Là j'ai pas mal gratter pour sortir le bon chemin... donc fait maison avec une surconsommation de $class.
//Autoloader.php
<?php
namespace App;
class Autoloader{
static function register()
{
spl_autoload_register(array(__CLASS__,'autoload'));
}
static function autoload($class)
{
if(strpos($class, __NAMESPACE__.'\\') === 0)
{
$class = str_replace(__NAMESPACE__.'\\', '', $class);
$class = str_replace('\\', '/', $class);
$class=strtolower(__NAMESPACE__).'/'.$class;
$class = ROOT.'/'.$class.'.php';
var_dump($class);
}
}
}
?>
//Table.php
<?php
namespace App\Table;
use Core\Database\Database;
class Table{
protected $table;
protected $db;
public function __construct(Database $db){
$this->db = $db;
$parts = explode('\\',get_class($this));
$classe_name = end($parts);
$this->table = strtolower(str_replace('Table', '', $classe_name));
}
public function All(){
return $this->db-> query('SELECT * FROM articles');
}
}
//PostsTable.php
<?php
namespace App\Table;
use App\Table;
//extends Table ::supprimer car impossible de me connecter au parent
class PostsTable{
}
Le but est que lors que je fait dans mon index ceci (ci-dessous) j'ai un résultat positif pour sortir mes Posts.
<?php
define('ROOT', dirname(__DIR__));
require ROOT . '/app/App.php';
App::load();
$app = App::getInstance();
$posts = $app->getTable('Posts');
var_dump($post);
?>
Merci d'avance !
et je ne sais pas mettre le sujet en résolu...
Sur la droite te ton message où tu as mis que ton problème est résolu, tu dois avoir un bouton comme ceci : .
Il te suffira donc de cliquer dessus.
Bien sûre :
Retour vardump App\Autoloader :
C:\wamp64\www\BloG\app\Autoloader.php:19:string 'C:\wamp64\www\BloG/app/Table/PostsTable.php' (length=43)
Architechture décrit ci-dessous :
-->> BloG<<--
[app]
[Table]
CategoriesTable.php
PostsTable.php
Table.php
UsersTable.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
categorie.php
home.php
notfound.php
single.php
[public]
[css]
[js]
index.php
[.buildpath]
[.project]
Re à toutes et à tous, j'ai avancé et la compréhension se fait petit à petit. Le problème vient de l'autoloader... je pense dans l'index ou l'App.
Pour charger mes class ("App\Table\Table" par exemple) il me faut le require du chemin des Classes demandées (Table.php dans cette exemple). Le but de l'autoloader est de générer les require à la volé. Hors le mien est un peu fainéant et n'en génère qu'un seul pour la première Classe demandée.
Exemple : si je rendre dans la [class PostsTable] enfant de la [classTable], mon code rentre dans PostsTable et ne charge pas Table car il me manque sont require... Je pense que j'ai loupé une étape de boucle... ou un truc dans le genre pour générer mes requires à la volée ( ou chargement de Classe). Sur cette découverte grandissante, je continue ma recherche formatrice mais si quelqu'un à une piste je la prends très volontier pour espérer continuer cette semaine dans les cours! A bientôt.
Résolu! C'étati bienl'auto loader. J'ai repris ma fonction autoload et travaillé avec le Var_Dump. Et débugé au fur à mesure le code. Voici mon autoloader désormais, si cela peu servir à quelqu'un :
<?php
namespace App;
class Autoloader {
public static function register()
{
spl_autoload_register(array(__CLASS__, 'autoload'));
}
public static function autoload($class)
{
var_dump($nameSpace = explode('\\', $class));
var_dump($i = count($nameSpace) - 1);
var_dump($nameSpace[0] = strtolower($nameSpace[0]));
var_dump($nameSpace[$i] = ucfirst($nameSpace[$i]));
$class = implode('/', $nameSpace);
var_dump(ROOT . '/' . $class . '.php');
require ROOT . '/' . $class . '.php';
}
}