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,
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.