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.

25 réponses


gamouza
Auteur
Réponse acceptée

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('../../'));
gamouza
Auteur

c'est pas encore résolu

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.

gamouza
Auteur

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.

gamouza
Auteur

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

Oui, exactement.

public static function getInstance() {
    if (is_null(self::$_instance)) {
        self::$_instance = new Config(/* Ici, tu devrais avoir quelque chose */);
    }
    return self::$_instance;
}
gamouza
Auteur

ok donc je déclare une variable et je la met de dans

gamouza
Auteur

Lartak
Pouvez vous m'aider encore là j'ai mis une variable mais rien

Montres moi le code.

gamouza
Auteur

<?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

gamouza
Auteur

<?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

gamouza
Auteur

<?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

gamouza
Auteur

<?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.

gamouza
Auteur

Mais pouvez vous mindiquer parceque là je ne comprends pas trop le PHP POO

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.

gamouza
Auteur

Oui j'ai mis une variable mais il me dit undefined file ( nom de mon variable

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.

gamouza
Auteur

public static function getInstance() {
$file = ROOT.'/config/config.php';
if (is_null(self::$_instance)) {
self::$_instance = new Config($file);
}
return self::$_instance;
}

Sauf qu'elle n'est définie nulle part ta variable $file.

gamouza
Auteur

Comment la définir pour qu'elle résoud l'erreur

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.