Bonjour,
je suis débutant en PHP POO et MVC
je suivais le tuto et j'ai tout fait mais
Voila je rencontre un petit problème avec mon code.
il met ce message:
Warning: Missing argument 1 for Core\Config::__construct(), called in C:\xampp\htdocs\BlogPOOMVC\app\App.php on line 14 and defined in C:\xampp\htdocs\BlogPOOMVC\core\Config.php on line 10
Notice: Undefined variable: file in C:\xampp\htdocs\BlogPOOMVC\core\Config.php on line 11
Warning: require(): Filename cannot be empty in C:\xampp\htdocs\BlogPOOMVC\core\Config.php on line 11
Fatal error: require(): Failed opening required '' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\BlogPOOMVC\core\Config.php on line 11
SVP besoin de vos aides.
oui j'ai vérifié et voici mon code conernant les deux classes
Classe App.php
<?php
use Core\Database\MysqlDatabase;
use Core\Config;
class App {
private static $_instance;
private static $db_instance;
private static $title = 'Mon Blog';
public static function getInstance() {
if (is_null(self::$_instance)) {
self::$_instance = new Config();
}
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/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;
}
public static function load() {
session_start();
require ROOT.'/app/Autoloader.php';
App\Autoloader::register();
require ROOT.'/core/Autoloader.php';
Core\Autoloader::register();
}
}
Classe Config.php
<?php
namespace Core;
class Config {
private $settings = [];
private static $_instance;
public function __construct($file) {
$this->settings = require($file);
}
public function getInstance($file) {
if (is_null(self::$_instance)) {
self::$_instance = new Config($file);
}
return self::$_instance;
}
public function get($key) {
if (!isset($this->settings[$key])) {
return NULL;
}
return $this->settings[$key];
}
}
Est-ce que tu as regarder au niveau des lignes indiquée dans chaques document indiqués lui aussi ?
Warning: Missing argument 1 for Core\Config::__construct(), called in C:\xampp\htdocs\BlogPOOMVC\app\App.php on line 14 and defined in C:\xampp\htdocs\BlogPOOMVC\core\Config.php on line 10
Notice: Undefined variable: file in C:\xampp\htdocs\BlogPOOMVC\core\Config.php on line 11
Warning: require(): Filename cannot be empty in C:\xampp\htdocs\BlogPOOMVC\core\Config.php on line 11
Fatal error: require(): Failed opening required '' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\BlogPOOMVC\core\Config.php on line 11
De plus il vaut mieux pour inclure des fichiers faire comme ci-dessous, de plus ça te permettra d'avoir des include
, include_once
, require
et require_once
qui iront chercher tes fichiers tous au même endroit !
set_include_path(realpath('../../'));
Bonjour.
Ton problème est pourtant indiqué dans les erreurs qui te sont retournées.
Le constructeur de ta classe Config, nécessite un argument, qui est $file
, sauf que lorsque tu y fait appel dans ta fonction getInstance de ta classe App, tu ne lui indiques aucun argument.
Lartak
je vois ce que vous dites et c'est ce que j'ai fait mais ya rien toujours la même erreur
je vois ce que vous dites et c'est ce que j'ai fait mais ya rien toujours la même erreur
Pourtant dans le code que tu as posté il y a environ 1 heure, tu fais toujours appel au constructeur sans lui passer l'argument.
Si tu l'as modifié entre-temps, montres-nous le, ainsi que les erreurs qui te sont retournées.
public static function getInstance() {
if (is_null(self::$_instance)) {
self::$_instance = new Config();
}
return self::$_instance;
}
vous parlez de cette partie
C'est pas modifier mais ce que j'ai fait je crois sur ce code
public static function getInstance() {
if (is_null(self::$_instance)) {
self::$_instance = new Config(/* Ici, tu devrais avoir quelque chose */);
}
return self::$_instance;
}
<?php
use Core\Database\MysqlDatabase;
use Core\Config;
class App {
private static $_instance;
private static $db_instance;
private static $title = 'Mon Blog';
public static function getInstance() {
if (is_null(self::$_instance)) {
self::$_instance = new Config();
}
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/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;
}
public static function load() {
session_start();
require ROOT.'/app/Autoloader.php';
App\Autoloader::register();
require ROOT.'/core/Autoloader.php';
Core\Autoloader::register();
}
}
c'est la classe App.php
<?php
namespace Core;
class Config {
private $settings = [];
private static $_instance;
public function __construct($file) {
$this->settings = require($file);
}
public static function getInstance($file) {
if (is_null(self::$_instance)) {
self::$_instance = new Config($file);
}
return self::$_instance;
}
public function get($key) {
if (!isset($this->settings[$key])) {
return NULL;
}
return $this->settings[$key];
}
}
la classe Config.php
<?php
define ('ROOT', dirname(DIR));
require ROOT.'/app/App.php';
App::load();
if (isset($_GET['p'])) {
$page = $_GET['p'];
} else {
$page = 'posts.index';
}
$page = explode('.', $page);
if ($page[0] == 'admin') {
$controller = '\App\Controller\Admin\' . ucfirst($page[1]) . 'Controller';
$action = $page[2];
} else {
$controller = '\App\Controller\' . ucfirst($page[0]) . 'Controller';
$action = $page[1];
}
$controller = new $controller();
$controller->$action();
index.php
<?php
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)); //.'s'
}
}
public function query($statement, $attributes = null, $one = false) {
if ($attributes) {
return $this->db->prepare(
$statement,
$attributes,
str_replace('Table', 'Entity', get_class($this)),
$one);
} else {
return $this->db->query(
$statement,
str_replace('Table', 'Entity', get_class($this)),
$one);
}
}
public function find($id) {
return $this->query(
"SELECT * FROM {$this->table} WHERE id = ?",[$id], TRUE);
}
public function all() {
return $this->query("SELECT * FROM ".$this->table);
}
public function create($fields) {
$sql_parts = [];
$attributes = [];
foreach ($fields as $k => $v) {
$sql_parts[] = "$k = ?";
$attributes[] = $v;
}
$sql_part = implode(', ', $sql_parts);
return $this->query("INSERT INTO {$this->table} SET $sql_part", $attributes, TRUE);
}
public function update($id, $fields) {
$sql_parts = [];
$attributes = [];
foreach ($fields as $k => $v) {
$sql_parts[] = "$k = ?";
$attributes[] = $v;
}
$attributes[] = $id;
$sql_part = implode(', ', $sql_parts);
return $this->query("UPDATE {$this->table} SET $sql_part WHERE id = ?", $attributes, TRUE);
}
public function delete($id) {
return $this->query("DELETE FROM {$this->table} WHERE id = ?", [$id], TRUE);
}
public function listRecord($key, $value) { //extract()
$records = $this->all();
$return = [];
foreach ($records as $v) {
$return[$v->$key] = $v->$value;
}
return $return;
}
}
la classe Table
Tu n'as absolument rien modifié dans ta fonction getInstance de ta classe App.
Tu fais toujours appel au constructeur de ta classe Config sans lui passer l'argument qu'il attend.
Je t'avais pourtant montré ce qu'il te manquait, en recopiant la fonction concerné et en y indiquant en commentaire où tu devais faire une modification.
Oui j'ai mis une variable mais il me dit undefined file ( nom de mon variable
Dans le dernier code que tu montres, il n'y a aucun changement avec le précédent, je ne vois donc pas où tu as pu définir une variable dans la fonction getInstance de ta classe App.
public static function getInstance() {
$file = ROOT.'/config/config.php';
if (is_null(self::$_instance)) {
self::$_instance = new Config($file);
}
return self::$_instance;
}
Si tu ne comprends pas comment la définir et avec quoi, c'est que tu n'as fait que recopier du code que tu ne comprends pas, je te recommande donc fortement de bien revisionner les vidéos de la formation.
Je ne vais pas t'apprendre quelque chose alors que Grafikart à fait des vidéos exprès pour le code dont il est question.