Bonjour les dev,
Je tente tant bien que mal de mettre en place le router du cours 'Mise en pratique de la POO' (video 3)
Voici le code en place:
Ma page index.php qui appelle la classe App et sa methode run
require '../vendor/autoload.php';
$app = new \Framework\App([
BlogModule::class
]);
$response = $app->run(\GuzzleHttp\Psr7\ServerRequest::fromGlobals());
\Http\Response\send($response);
Ma class App
namespace Framework;
use GuzzleHttp\Psr7\Response;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Zend\Expressive\Router\FastRouteRouter;
class App
{
/**
* $modules
*
* @var array
*/
private $modules = [];
/**
* $router
*
* @var Router
*/
private $router;
/**
* App contructor
*
* @param string[] $modules liste des modules à charger
*/
public function __contruct(array $modules = [])
{
$this->router = new Router();
foreach($modules as $module){
$this->modules[] = new $module($this->router);
}
}
/**
* Permet de lancer l'application en prenant en prametre la requete
* (Elle Verifie si il y des requete passées en Get, Post ou autre)
*
* @param ServerRequestInterface $request
* @return ResponseInterface
*/
public function run(ServerRequestInterface $request): ResponseInterface
{
$uri = $request->getUri()->getPath();
if (!empty($uri) && $uri[-1] === "/")
{
return (new Response())->withStatus(301)->withHeader('Location:', substr($uri, 0, -1));
}
$route = $this->router->match($request);
if(is_null($route))
{
return new Response(404, [], '<h1>Erreur 404</h1>');
}
$response = call_user_func_array($route->getCallback(), [$request]);
if(is_string($response))
{
return new Response(200, [], $response);
}
elseif($response instanceof ResponseInterface)
{
return $response;
}
else
{
throw new \Exception('The response is not a string or instance of ResponseInterface');
}
}
}
Ma classe Router
namespace Framework;
use Framework\Router\Route;
use Psr\Http\Message\ServerRequestInterface;
use Zend\Expressive\Router\FastRouteRouter;
use Zend\Expressive\Router\Route as ZendRoute;
/**
* Enregistre et vérifie une route
*/
class Router{
/**
* $router
*
* @var FastRouteRouter
*/
private $router;
public function __construct()
{
$this->router = new FastRouteRouter();
}
/**
* @param string $url Url de la route
* @param callable $callable Fonction à appeler
* @param string $name Nom de la route
*/
public function get(string $path, callable $callable, string $name)
{
$this->router->addRoute(new ZendRoute($path, $callable, ['GET'], $name));
}
/**
* @param ServerRequestInterface $request La requete de l'utilisateur
* @return Route|null
*/
public function match(ServerRequestInterface $request): ?Route
{
$result = $this->router->match($request);
if($result->isSuccess()){
return new Route(
$result->getMatchedRouteName(),
$result->getMatchedMiddleware(),
$result->getMatchedParams()
);
}
return null;
}
public function generateUri(string $name, array $params): ?string
{
return $this->router->generateUri($name, $params);
}
}
Lorque je tente d'aller sur la page localhost:8000/blog dans mon navigateur (et d'ailleurs sur toutes les pages) j'ai l'erreur suivante
Fatal error: Uncaught Error: Call to a member function match() on null in C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\src\Framework\App.php:76 Stack trace: #0 C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\public\index.php(11): Framework\App->run(Object(GuzzleHttp\Psr7\ServerRequest)) #1 {main} thrown in C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\src\Framework\App.php on line 76
Du coup les tests réalisés sur la classe App plantent également avec la même erreur.
J'avoue que je sèche et je n'arrive pas à comprendre.
N'hésitez pas à me dire s'il vous manque des éléments pour traiter le problème.
Merci d'avance à celui qui pourra m'apporter de l'aide.
Ton object "Router" ne s'instancie pas... est-ce que la class Router est bien importée au moment ou tu créé l'objet ?
Il pourrait être interessant de faire un class_exists('Router') avant d'instancier l'objet.
Bonjour Soundboy 39 et merci pour ton retour
Pour info j'ai fait une erreur en cloturant le cas, cela ne fonctionne toujours pas.
Effectivment il semblerait que mon objet ne s'instancie pas.
J'ai ajouté un use Framework\Router dans ma classe App (même si à mon sens il n'y en a pas besoin puisque les deux classes sont dans le même namspace.
J'ai également fait un class_exists('Router') comme tu l'a préconisé et j'obtiens false, ce qui confirme que la classe n'est pas présente.
Je n'arrive pas à expliquer ce comportement.
OK...
Est-ce qu'au moins le fichier de la class est chargé ? Est-ce que tu le vois si tu fais un var_dump(get_included_files()) ?
J'ai inséré la fonction get_included_files() juste au debut de ma méthode run dans la classe App
A ce niveau l'objet Router est sensé être instancié au niveau du constructeur de App
Voila le tableau que me retourne.
array(30) {
[0]=>
string(69) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\public\index.php"
[1]=>
string(72) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\autoload.php"
[2]=>
string(86) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\composer\autoload_real.php"
[3]=>
string(87) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\composer\platform_check.php"
[4]=>
string(84) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\composer\ClassLoader.php"
[5]=>
string(88) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\composer\autoload_static.php"
[6]=>
string(110) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\phpunit\phpunit\src\Framework\Assert\Functions.php"
[7]=>
string(96) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\symfony\polyfill-ctype\bootstrap.php"
[8]=>
string(98) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\symfony\polyfill-ctype\bootstrap80.php"
[9]=>
string(105) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\ralouphie\getallheaders\src\getallheaders.php"
[10]=>
string(101) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\guzzlehttp\psr7\src\functions_include.php"
[11]=>
string(93) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\guzzlehttp\psr7\src\functions.php"
[12]=>
string(104) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\myclabs\deep-copy\src\DeepCopy\deep_copy.php"
[13]=>
string(94) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\nikic\fast-route\src\functions.php"
[14]=>
string(106) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\http-interop\response-sender\src\functions.php"
[15]=>
string(74) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\src\Framework\App.php"
[16]=>
string(97) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\guzzlehttp\psr7\src\ServerRequest.php"
[17]=>
string(91) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\guzzlehttp\psr7\src\Request.php"
[18]=>
string(101) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\psr\http-message\src\RequestInterface.php"
[19]=>
string(101) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\psr\http-message\src\MessageInterface.php"
[20]=>
string(96) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\guzzlehttp\psr7\src\MessageTrait.php"
[21]=>
string(107) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\psr\http-message\src\ServerRequestInterface.php"
[22]=>
string(87) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\guzzlehttp\psr7\src\Uri.php"
[23]=>
string(97) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\psr\http-message\src\UriInterface.php"
[24]=>
string(97) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\guzzlehttp\psr7\src\CachingStream.php"
[25]=>
string(100) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\psr\http-message\src\StreamInterface.php"
[26]=>
string(104) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\guzzlehttp\psr7\src\StreamDecoratorTrait.php"
[27]=>
string(98) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\guzzlehttp\psr7\src\LazyOpenStream.php"
[28]=>
string(90) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\guzzlehttp\psr7\src\Stream.php"
[29]=>
string(89) "C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\vendor\guzzlehttp\psr7\src\Utils.php"
}
Le fichier App.php apparait mais le fichier Router.php n'apparait pas.
Effectivement il n'apparait pas, le problème viendrait donc de ton autoloader.
Pour confirmer tu peux inclure le fichier manuellement en faisant un require_once 'C:\Users\micka\Desktop\devLab\grafikart-poo-pratique\src\Framework\Router.php' (corriger le chemin si il n'est pas bon...) juste après require '../vendor/autoload.php';
Si après ça ta class est disponible, c'est qu'il y a bien un souci au niveau de l'autoload.
SoundBoy39 j'ai essayé de mettre en place le require_once du router juste après require '../vendor/autoload.php';
Cela ne fonctionne toujours pas.
Par contre ta suggestion m'a mis à l'esprit de faire un dump_autoload et j'obtient une erreur sur la commande
[Composer\Exception\NoSslException]
The openssl extension is required for SSL/TLS protection but is not available. If you can not enable the openssl extension, you can disable this error, at your own risk, by setting th
e 'disable-tls' option to true.
J'ai peut etre un souci avec composer. Je vais réinstaller tout ca au propre et je te ferai un retour prochainement pour voir si cela se règle.
Merci encore pour ton aide précieuse.