Bonjour,

Je rencontre un petit problème avec mon code, je suis actuellement en train de suivre le tutoriel "Le router", je rencontre une petite erreur que je n'arrive pas a résoudre

Ce que je fais

Fichier Route.php

<?php

namespace App;

class Route {

    /**
     * @var string
     * @var callable
     * @var array
     */
    private $name;
    private $callback;
    private $parameters;

    public function __construct(string $name, callable $callback, array $parameters) {

    }

    /**
     * @return string
     */
    public function getName(): string {
        return $this->name;
    }

    /**
     * @return callable
     */
    public function getCallback(): callable {
        return $this->callback;
    }

    /**
     * Retrieve the URL Parameters
     * @return string[]
     */
    public function getParams(): array {
        return $this->parameters;
    }
}

Fichier RouterTest.php

<?php

namespace Tests\App;

use App\Router;
use GuzzleHttp\Psr7\ServerRequest;
use PHPUnit\Framework\TestCase;

class RouterTest extends TestCase {

    /**
     * @var Router
     */
    private $router;

    public function setUp() {
        $this->router = new Router();
    }

    public function testGetMethod() {
        $request = new ServerRequest('GET', '/blog');
        $this->router->get('/blog', function () { return 'hello'; }, 'blog');
        $route = $this->router->match($request);
        $this->assertEquals('blog', $route->getName());
        $this->assertEquals('hello', call_user_func_array($route->getCallback(), [$request]));
    }

    public function testGetMethodIfURLDoesNotExists() {
        $request = new ServerRequest('GET', '/blog');
        $this->router->get('/blogaze', function () { return 'hello'; }, 'blog');
        $route = $this->router->match($request);
        $this->assertEquals(null, $route);
    }

    public function testGetMethodWithParameters() {
        $request = new ServerRequest('GET', '/blog/mon-slug-8');
        $this->router->get('/blog', function () { return 'azeaze'; }, 'posts');
        $this->router->get('/blog/{slug:[a-z0-9\-]+}-{id:\d+}', function () { return 'hello'; }, 'post.show');
        $route = $this->router->match($request);
        $this->assertEquals('post.show', $route->getName());
        $this->assertEquals('hello', call_user_func_array($route->getCallback(), [$request]));
        $this->assertEquals(['slug' => 'mon-slug', 'id' => '8'], $route->getParams());
    }
}

Ce que je veux

Je voudrais que le teste passe au vert

Ce que j'obtiens

Le teste avec PHPUnit me dit les erreurs suivantes :
TypeError : Return value of App\Router\Route::getName() must be of the type string, null returned

La deuxième
TypeError : Return value of App\Router\Route::getCallback() must be callable, null returned

La troisième
TypeError : Return value of App\Router\Route::getParams() must be of the type array, null returned

Merci d'avance pour votre aide, de mon côté j'essaye de regler cette erreur

Si ça peut aider et que le problème vienne d'une version d'un library, voici les require de mon composer.json

"require": {
        "michelf/php-markdown": "1.8.0",
        "guzzlehttp/psr7": "^1.5",
        "http-interop/response-sender": "^1.0",
        "zendframework/zend-expressive-fastroute": "1.2.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^6.2",
        "squizlabs/php_codesniffer": "^3.4"
    },

1 réponse


Carouge10
Réponse acceptée

Bonjour,
Vu que la réponse à été donner sur OCC et que le constructeur n'est pas rempli.
Tu peux mettre le sujet en résolu.