Créer un modèle MVC à partir de Slim Framework
Posté : 10 nov. 2014, 03:44
Bonsoir à tous 
Ceci est mon premier message sur le forum donc j'en profite pour me présenter. Je m'appelle Alexandre et je suis actuellement à la recherche d'emploi (et oui c'est à la mode en ce moment :/) et pour passer le temps je me suis remis à une vieille passion que j'avais jadis, réaliser des sites internet en php. Sauf que quand je me suis arrêté on en était à la transition entre PHP3 et PHP4. Autant dire que j'ai pris un sacré retard, notamment au niveau de la POO. Donc pour tenter de combler ce retard j'ai voulu m'intéresser aux frameworks, mais pas aux usines à gaz, un tout petit gentil mignon qui mord pas pour commencer
C'est comme ça que j'ai découvert Slim Framework, qui ne gère pas beaucoup de librairies et pour être honnête, ne fait pas grand chose. J'ai donc décidé de créer un système MVC à partir de ce framework. J'ai pour cela (avec un tutoriel je vous l'accorde) réalisé quelques classes pour compléter ce code, notamment un routeur, une classe controller et une classe model (la base d'un mvc me direz vous
), et je me retrouve confronté à une erreur... Que je ne comprends pas :/
Erreur que voici :
Voici donc les fichiers concernés :
lib.php (fichier de démarrage) :
load_class :
Si quelqu'un aurait la solution ou ne serait-ce qu'un début d'explication je suis preneur
Je vous remercie par avance
Alexandre.
Ceci est mon premier message sur le forum donc j'en profite pour me présenter. Je m'appelle Alexandre et je suis actuellement à la recherche d'emploi (et oui c'est à la mode en ce moment :/) et pour passer le temps je me suis remis à une vieille passion que j'avais jadis, réaliser des sites internet en php. Sauf que quand je me suis arrêté on en était à la transition entre PHP3 et PHP4. Autant dire que j'ai pris un sacré retard, notamment au niveau de la POO. Donc pour tenter de combler ce retard j'ai voulu m'intéresser aux frameworks, mais pas aux usines à gaz, un tout petit gentil mignon qui mord pas pour commencer
C'est comme ça que j'ai découvert Slim Framework, qui ne gère pas beaucoup de librairies et pour être honnête, ne fait pas grand chose. J'ai donc décidé de créer un système MVC à partir de ce framework. J'ai pour cela (avec un tutoriel je vous l'accorde) réalisé quelques classes pour compléter ce code, notamment un routeur, une classe controller et une classe model (la base d'un mvc me direz vous
Erreur que voici :
Code : Tout sélectionner
Slim Application Error
The application could not run because of the following error:
Details
Type: ErrorException
Code: 2
Message: Missing argument 1 for Model::__construct(), called in /Users/Alexandre/Sites/alexandre/libs/autoload.php on line 36 and defined
File: /Users/Alexandre/Sites/alexandre/libs/class/model.class.php
Line: 20lib.php (fichier de démarrage) :
// On inclut Slim Framework
include('./vendor/Slim/Slim' . EXT);
// Début des sessions
session_start();
\Slim\Slim::registerAutoloader();
// Chargement de slim
$app = new \Slim\Slim(array(
'templates.path' => 'views',
));
// Fichiers de configuration
include('./config' . EXT);
include('./libs/autoload' . EXT);
// Connexion à la base de donnée
try{
$db = new PDO('mysql:host=' . $db_log['host'] . ';dbname=' . $db_log['database'], $db_log['datauser'], $db_log['password']);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
} catch( exception $e) {
echo "Impossible de se connecter à la base de donnée<br />";
echo $e->getMessage();
die();
}
// Classe de la base de donnée
$app->pdo = function(){
load_class('Database', $db);
};
/*
// Controller
$app->controller = function(){
load_class('Controller', $app);
};
// Modèles
$app->model = function(){
load_class('Model', $app);
};
*/
include('./libs/class/model.class' . EXT);
include('./libs/class/controller.class' . EXT);
// Configuration
$app->cfg = function(){
load_class('Config', $app);
};
// Sessions
$app->session = function(){
load_class('Sessions');
};
/* EoF */
Vous remarquerez que ce fichier est assez bidouillé avec des commentaires (et autres) suite à de nombreux tests :/load_class :
function load_class($class, $param = NULL)
{
if( file_exists('./libs/class/' . strtolower($class) . '.class' . EXT) )
{
require('./libs/class/' . strtolower($class) . '.class' . EXT);
}
else if( file_exists('./controllers/' . $class . EXT) )
{
require('./controllers/' . $class . EXT);
}
else if( file_exists('./models/' . $class . EXT) )
{
require('./models/' . $class . EXT);
}
if( $param == NULL )
{
return new $class();
}
else
{
return new $class($param);
}
}
la classe routeur :class Router
{
// Slim Framework
private $app;
/*
** Constructeur
*/
public function __construct($app)
{
$this->app = $app;
}
/*
** Function permettant d'appeler une méthode du router Slim, et
** de retourner le controller associé
** ------------
** @method : méthode utilisée de Slim (post|get)
** @$url : url de l'action (controller)
** @$action : action du controller
** @$param : paramètre variable (id, etc)
*/
public function call($method, $url, $action)
{
return $this->app->$method($url, function() use ($action)
{
$action = explode('@', $action);
$controller_name = $action[0] . 'Controller';
$method = $action[1];
$controller = load_class($controller_name, $this->app);
call_user_func_array(array($controller, $method), func_get_args());
});
}
/*
** Alias GET de la fonction call
*/
public function get($url, $action)
{
return $this->call('get', $url, $action);
}
/*
** Alias POST de la fonction call
*/
public function post($url, $action)
{
return $this->call('post', $url, $action);
}
}
Controller et Model :class Controller
{
// Slim Application
protected $app;
protected $model;
/*
** On rapelle l'application Slim à chaque controller
** et on charge la classe modèle
*/
public function __construct($app)
{
$this->app = $app;
}
}
class Model
{
// Slim Framework
protected $app;
/*
** Constructeur, instance de Slim Framework
*/
public function __construct($app)
{
$this->app = $app;
}
/*
** Supprime un champ de table en fonction d'une id
*/
public function delete($table, $field, $id)
{
$this->app->pdo->prepare("DELETE FROM " . PREFIX . $table . " WHERE $field=:id");
$this->app->pdo->execute(array('id' => intval($id)));
}
}
La classe Controller semble marcher mais je ne comprends pas cette erreur de l'argument manquant dans ma classe Model :/Si quelqu'un aurait la solution ou ne serait-ce qu'un début d'explication je suis preneur
Je vous remercie par avance
Alexandre.