Problème Tuto sur "Mise en pratique de la POO" (Router)

Par Playzer, il y a 7 ans


Bonjour,

Je suis actuellement le tutoriel de Grafikart : Le Router - Mise en pratique de la POO en Php"
https://www.grafikart.fr/tutoriels/router-919

Voila je rencontre un petit problème avec mon code.
Je rencontre cette erreur :

Fatal error: Uncaught TypeError: Argument 3 passed to Components\Router::get() must be an instance of Components\srting, string given, called in C:\xampp\htdocs\Frame\Framework\Blog\BlogModule.php on line 11 and defined in C:\xampp\htdocs\Frame\Components\Router.php:27 Stack trace: #0 C:\xampp\htdocs\Frame\Framework\Blog\BlogModule.php(11): Components\Router->get('/blog', Array, 'blog.index') #1 C:\xampp\htdocs\Frame\Components\App.php(24): Framework\Blog\BlogModule->__construct(Object(Components\Router)) #2 C:\xampp\htdocs\Frame\public\index.php(6): Components\App->__construct(Array) #3 {main} thrown in C:\xampp\htdocs\Frame\Components\Router.php on line 27

Je ne comprend vraiment pas pourquoi...
J'ai pourtant bien fait comme Grafikart.

Voici mon router :

<?php namespace Components; use Components\Router\Route; use Psr\Http\Message\ServerRequestInterface; use Zend\Expressive\Router\FastRouteRouter; use Zend\Expressive\Router\Route as ZendRoute; /** * Class router * Register a match routes */ class Router { private $router; public function __construct() { $this->router = new FastRouteRouter(); } /** * @param string $path * @param callable $callable * @param string $name */ public function get(string $path, callable $callable, srting $name) { $this->router->addRoute(new ZendRoute($path, $callable, ['GET'], $name)); } /** * @param ServerRequestInterface $request * @return Route/null */ public function match(RequestInterface $request): ?Route { $result = $this->router->match($request); if ($result->isSuccess()) { return new Route( $result->getMatchRouteName(), $result->getMatchedMiddleware(), $result->getMatchedParams() ); } return null; } public function generateUri(string $name, array $params): ?string { return $this->router->generateUri($name, $params); } }

BlogModule.php

<?php namespace Framework\Blog; use Components\Router; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; class BlogModule { public function __construct(Router $router) { $router->get('/blog', [$this, 'index'], 'blog.index'); $router->get('/blog/{slug:[a-z\-]+}', [$this, 'show'], 'blog.show'); } public function index(Request $request): string { return '<h1>Bienvenue sur le blog !</h1>'; } public function show(Request $request): string { return '<h1>Bienvenue sur l\'article ' . $request->getAttribute('slug') . '</h1>'; } }

Si vous remarquez que les namespace sont différents que ceux du tuto, c'est normal. C'est parce que j'ai juste refait l'architecture à mon goût.

Je vous remercie pour toute l'aide que vous pourriez m'apporter.

Bonne soirée à vous.

Cordialement,

2 réponses

Lartak, il y a 7 ans

Bonjour.
Le message d'erreur est pourtant très explicite :

Argument 3 passed to Components\Router::get() must be an instance of Components\ srting, string given

Pour faire simple, tu as une erreur de typo dans le nom d'un typage, tu as défini srting au lieu de string en 3ème argument de la méthode get.

Playzer, il y a 7 ans

Merci à toi Lartak, le sujet est résolu ! :D