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
Réponse acceptée

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
Auteur

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