Tuto POO en PHP

Par Marylin Laforest, il y a 9 ans


Bonjour,

Je suis le tutoriel https://www.grafikart.fr/formations/programmation-objet-php et je suis rendu au chapitre 18.
Mais voila, je rencontre un petit problème avec mon code.

Voici mon fichier users.php

<?php $users = App::getInstance()->getTable('users')->getAll(); ?> <div id="contenu"> <table> <thead> <tr> <th> <a>Nom</a> </th> <th> <a>Nom d'utilisateur</a> </th> <th> <a>Groupe</a> </th> <th> <a>Désactivé</a> </th> </tr> </thead> <tbody> <?php foreach ($users as $user): ?> <tr id="user_<?= $user->id_user ?>" onclick="window.location.href='<?= $user->url ?>'"> <td> <?= $user->name_user ?> </td> <td> <?= $user->username_user ?> </td> <td> <?= $user->name_group ?> </td> <td class="boolean"> <input type="checkbox" <?= ($user->active_user) ? 'checked' : '' ?> disabled=""> </td> </tr> <? endforeach; ?> </tbody> <tfoot></tfoot> </table> </div>

Ce qui ne fonctionne pas c'est lorsque je fais cette ligne, je me retrouve avec une page blanche.

<?= $user->url ?>

Voici mes autres fichiers:

App.php:

<?php use Core\Config; use Core\Database; class App{ private static $_instance; private $db_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\\Model\\Model' . ucfirst($name); 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 Database($config->get('db_name'), $config->get('db_user'), $config->get('db_pass'), $config->get('db_host')); } return $this->db_instance; } }

ModelUsers.php

<?php namespace App\Model; use Core\Model\Model; class ModelUsers extends Model{ public function __get($name) { $method = 'get' . ucfirst($name); $this->$name = $this->$method(); return $this->$name; } public function getUrl(){ return 'index.php?p=users.edit&id='. $this->id_user; } }

Model.php

<?php namespace Core\Model; use Core\Database; class Model{ protected $table; protected $db; public function __get($name) { $method = 'get' . ucfirst($name); $this->$name = $this->$method(); return $this->$name; } public function __construct(Database $db) { $this->db = $db; if(is_null($this->table)){ $class_parts = explode('\\', get_class($this)); $class_name = end($class_parts); $this->table = strtoupper(str_replace('Model', '', $class_name)); } } public function query($statement, $attributes = null, $one = false){ if($attributes){ return $this->db->prepare($statement, $attributes, get_called_class(), $one); }else{ return $this->db->query($statement, get_called_class(), $one); } } public function getAll(){ return $this->query("SELECT * FROM " . $this->table); } }

Database.php:

<?php namespace Core; use \PDO; class Database { private $db_name; private $db_user; private $db_pass; private $db_host; private $pdo; public function __construct($db_name, $db_user, $db_pass, $db_host) { $this->db_name = $db_name; $this->db_user = $db_user; $this->db_pass = $db_pass; $this->db_host = $db_host; } private function getPDO() { if ($this->pdo === null) { $pdo = new PDO('mysql:dbname=' . $this->db_name . ';host=' . $this->db_host, $this->db_user, $this->db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo = $pdo; } return $this->pdo; } public function query($statement, $class_name = null, $one = false) { $req = $this->getPDO()->query($statement); if($class_name === null){ $req->setFetchMode(PDO::FETCH_OBJ); }else{ $req->setFetchMode(PDO::FETCH_CLASS, $class_name); } if ($one) { $data = $req->fetch(); } else { $data = $req->fetchAll(); } return $data; } public function prepare($statement, $attributes, $class_name = null, $one = false) { $req = $this->getPDO()->prepare($statement); if($class_name === null){ $req->setFetchMode(PDO::FETCH_OBJ); }else{ $req->setFetchMode(PDO::FETCH_CLASS, $class_name); } $req->execute($attributes); if ($one){ return $req->fetch(); } else{ return $req->fetchAll(); } } }

Je ne sais pas si vous avez tout ce que vous avez besoin pour m'aider, mais faites le moi savoir.

5 réponses

Lartak, il y a 9 ans

Bonjour.
Est-ce que tu as bien les messages d'erreurs activés sur ton serveur web ?
Tu devrais regarder dans les logs de ton serveur web pour voir si tu n'y as pas l'explication du problème.

Marylin Laforest, il y a 9 ans

Je les ai mais il ne me parle pas bien bien...
Catchable fatal error: Argument 1 passed to Core\Model\Model::__construct() must be an instance of Core\Database, none given in /core/Model/Model.php on line 19

chaque fois que j'instancie un Model je passe bel et bien une instance de Core\Database. J'ai vérifié :(

AlexJM, il y a 9 ans

Tu n'as pas d'enfants de model que tu instantierais sans la bdd ?

Marylin Laforest, il y a 9 ans

Tous mes enfants sont instanciés de cette façon. :S Il n'y a aucune autre place que j'instancie le parent ou bien les enfants.

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

Par contre, cela pourrait peut-être vous aider à m'aider!!
Dans mon fichier users.php lorsque je fais:

var_dump(App::getInstance()->getTable('users')->getAll());

Je me retrouve avec mon objet tel que je le veux.

Dans ma database, si je fais un

$req->setFetchMode(PDO::FETCH_OBJ);

ça fonctionne. Par contre, mon lien:

<tr id="ui-datagrid-1_<?= $user->id_user ?>" onclick="window.location.href='<?= $user->url ?>'">

n'est pas valide car mon objet $user n'est pas du type ModelUsers, donc il ne connait pas url.

Alors lorsque je fais

$req->setFetchMode(PDO::FETCH_CLASS, $class_name);

l'application plante au complet ...

Marylin Laforest, il y a 9 ans

J'ai transférer mon getURL() dans une autre classe et maintenant ça fonctionne. Merci de votre aide!