Bonjour,

je viens vers vous car je cherche depuis plusieurs heures sans comprendre le problème...

Voilà je suis à la 30ème minute de ce tutoriel, tout marche bien (après quelques bidouille tout de même).

on utilise donc la fonction call_user_func_array et là c'est le drame : j'obtiens une erreur

( ! ) Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'PagesController' does not have a method 'index' in C:\wamp\www\ImpactTest\core\Dispacher.php on line 11

voici mon fichier Dispacher :
<?php
class Dispacher{

var $request;
function Dispacher()
{
$this->request=new Request();
Router::parse($this->request->url,$this->request);
$controller = $this->loadController();
call_user_func_array(array($controller,$this->request->action),array());
}

function loadController()
{
$name=ucfirst($this->request->controller).'Controller';
$file=ROOT.DS.'controller'.DS.$name.'.php';
require $file;
return new $name($this->request);
}
}
?>

il s'avère quand je fais un echo($this->request->action) que j'obtiens "index"(sans guillemets). Je ne comprends pas alors que cette fonction devrais pourtant permettre d'appeler la fonction view() sur la page PagesController?

Merci pour vos réponses (je suis débutante, donc toutes explications sont les bienvenues :) )

Voici mes autres fichiers si cela peut éclairer :

PagesController :
<?php
class PagesController extends Controller
{
function view()
{
echo 'Vous voyez?';
}
}
?>

Controller :
<?php
class Controller{

}
?>

includes :
<?php
require 'Request.php';
require 'Router.php';
require 'Controller.php';
require 'Dispacher.php';
?>

Request
<?php
class Request{
public $url; //URL appellé par l'utilisateur
function Request()
{
$this->url=$_SERVER'PATH_INFO'];
}
}
?>

Router:
<?php
class Router
{
/**
*Permet de parser une url
*@param $url => Url à parser
*@return tableau contenant les paramètres
**/
static function parse($url,$request)
{
$url=trim($url,'/');
$params = explode('/',$url);
$request->controller =$params[0];
$request->action = isset($param[1])? $params[1] : 'index';
$request->param=array_slice($params,2);
return true;
}
}
?>

index :
<?php
define('WEBROOT',dirname(__FILE__));
define('ROOT',dirname(WEBROOT));
define('DS',DIRECTORY_SEPARATOR);
define('CORE',ROOT.DS.'core');
define('BASE_URL',dirname(dirname($_SERVER'SCRIPT_NAME'])));

require CORE.DS.'includes.php';
$dispacher = new Dispacher();
?>

9 réponses


Anarien
Auteur
Réponse acceptée

J'ai trouvé! en fait si l'on regarde bien, juste un problème de réécriture... je suis désolée et merci de votre aide, maintenant ça marche très bien ^^" (il manquait le s à param dans le array, et c'est pas faute d'avoir relu et demandé à 2 autre personnes de regarder >.<)

<?php
class Router
{
/**
*Permet de parser une url
*@param $url => Url à parser
*@return tableau contenant les paramètres
**/
static function parse($url,$request)
{
$url=trim($url,'/');
$params = explode('/',$url);
$request->controller =$params[0];
$request->action = isset($param <u>s</u> [1])? $params[1] : 'index';
$request->param=array_slice($params,2);
return true;
}
}
?>

est-ce que tu peux faire var_dump($controller); à la fin de la classe Dispatcher ? Théoriquement $controller ne contient pas un nom de classe valide

Anarien
Auteur

je viens de tester, je l'ai mis juste après la dernière fonction de la classe et j'obtiens cette erreur :
( ! ) Parse error: syntax error, unexpected 'var_dump' (T_STRING), expecting function (T_FUNCTION) in C:\wamp\www\ImpactTest\core\Dispacher.php on line 20

non tu mets après la fermeture de la classe
var_dump($controller);

Anarien
Auteur

alors ça me donne ces erreurs :

( ! ) Notice: Undefined variable: controller in C:\wamp\www\ImpactTest\core\Dispacher.php on line 22

null

( ! ) Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'PagesController' does not have a method 'index' in C:\wamp\www\ImpactTest\core\Dispacher.php on line 10

Il cherche index car tu n'as peut être pas précisé view dans ton url (site/pages/view)
Si tu veux aller sur site/pages et tomber sur view(),
soit tu modifies dans router 'index' par 'view' pour que ce soit la fonction lancée par défaut,
soit tu crées une fonction index dans pagesController et dedans, tu appelles view() ou alors tu y mets le code qu'il y a dans view().

Anarien
Auteur

Mais hum, comment dire c'est pas un peu tricher? :p
j'avais remarqué que je pouvais le faire mais il y a surement une solution pour que ça fonctionne comme dans le tuto?
Sinon mon url est http://localhost/Site/pages/view/index comme dans le tuto (j'ai essayer de coller au mieux en me disant que ça aurait plus de chance de fonctionner :'( )

Sinon en effet cela fonctionne si je remplace index par view dans le Router mais si j'ai bien compris il devrai plutot me prendre view par defaut en action puisque index c'est uniquement si ce param n'existe pas? o.O

Merci pour vos réponses!

Oui alors en effet il prend la valeur par défaut.
Dans la fonction construct de la classe Dispatcher,
après la ligne Router::parse fais un var_dump($this->request),
est-ce que tous les paramètres sont bien présents ?

Anarien
Auteur

j'obtiens cette réponse :
object(Request)[2]
public 'url' => string '/pages/view/index' (length=17)
public 'controller' => string 'pages' (length=5)
public 'action' => string 'index' (length=5)
public 'param' =>
array (size=1)
0 => string 'index' (length=5)