Bonjour,
A la 33è mn de la vidéo, le header est renvoyé depuis la fonction e404 de la classe Controller. Mais cela provoque une erreur :
Warning : Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\www\Tuto\core\Model.php:56) in C:\xampp\htdocs\www\Tuto\core\Controller.php on line 74
La classe Controller.php :
"<?php
/**
* Controller : Classe parente de tous les controllers.
*
*/
class Controller {
public $request;
private $vars = array();
public $layout = 'default';
private $rendered = false;
/**
* Constructeur
* @param $request Objet request de notre application
**/
function __construct($request) {
$this->request = $request; //On stocke la variable dans l'instance
}
/**
* Permet de rendre une vue
* @param $view Fichier à rendre (chemin depuis view ou nom de la vue)
**/
public function render($view) {
if ($this->rendered === true) {return false;}
extract($this->vars);
if(strpos($view, '/') === 0) {
$view = ROOT.DS.'view'.DS.$view.'.php';
}
else {
$view = ROOT.DS.'view'.DS.$this->request->controller.DS.$view.'.php';
}
ob_start();
require $view;
$content_for_layout = ob_get_clean();
require ROOT.DS.'view'.DS.'layout'.DS.$this->layout.'.php';
$this->rendered = true;
}
/**
* Permet de passer une ou plusieurs variables à la vue
* @param $key Nom de la variable OU tableau de variables
* @param $value Valeur de la variable
**/
public function set($key, $value = null) {
if (is_array($key)) {
$this->vars += $key;
}
else {
$this->vars[$key] = $value;
}
}
/**
* Permet de charger un modèle
* @param $name Nom du modèle
*/
function loadModel($name) {
$file = ROOT.DS.'model'.DS.$name.'.php';
require_once $file;
if(!isset($this->name)) {
$this->$name = new $name();
}
}
/**
* Permet de gérer les erreurs 404
*/
function e404($message) {
header("HTTP/1.1 404 Not Found");
$this->set('message', $message);
$this->render('/errors/404');
die();
}
}
?>
"
La classe Model.php :
"
<?php
class Model {
static $connections = array();
public $conf = 'default';
public $table = false;
public $db;
public function __construct() {
//Connection à la BDD
$conf = Conf::$databases[$this->conf];
if(isset(Model::$connections[$this->conf])) {
$this->db = Model::$connections[$this->conf];
return true;
}
try {
$pdo = new PDO('mysql:host='.$conf['host'].';dbname='.$conf['name'].';'.$conf['login'],$conf['password']);
Model::$connections[$this->conf] = $pdo;
$this->db = $pdo;
}
catch(PDOException $e) {
if (Conf::$debug >= 1) {
die($e->getMessage());
}
else {
die('Impossible de se connecter à la base de données');
}
}
//Initialisation de qqs variables
if($this->table === false) {
$this->table = strtolower(get_class($this)).'s';
}
}
public function find($req) {
$sql = 'SELECT * FROM '.$this->table.' as '.get_class($this).' ';
//Construction des conditions
if(isset($req['conditions'])) {
$sql .= 'WHERE '.$req['conditions'];
}
$pre = $this->db->prepare($sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
public function findFirst($req) {
return current($this->find($req));
}
}
?>
"
Finalement, la réponse était dans le Warning : il y avait un espace à la fin de Model.php, après le dernier ?>
Si ça peut aider quelqu'un...
Bonjour,
c'est pour cela qu'on ne met jamais "?>" à la fin d'un fichier php (si ce dernier se termine par du php