Bonjour,
Je suis en train de suivre la POO par la pratique sur ce site et je bloque sur le chapitre Tout middleware !
j'ai bien suivi les étapes mais dès le début je n'arrive pas a faire fonctionner le TrailingSlashMiddleware.php.
J'ai une erreur :
Uncaught DI\NotFoundException: No entry or class found for 'Framework\Middleware\TrailingSlashMiddleware'
code App.php:
<?php
namespace Framework;
use DI\ContainerBuilder;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Server\MiddlewareInterface;
class App implements RequestHandlerInterface
{
/**
* List of modules
* @var array
*/
private $modules = [];
/**
* @var string
*/
private $definition;
/**
* @var ContainerInterface
*/
private $container;
/**
* @var string[]
*/
private $middlewares;
/**
* @var int
*/
private $index = 0;
public function __construct(string $definition)
{
$this->definition = $definition;
}
/**
* Rajoute un module à l'application
*
* @param string $module
* @return App
*/
public function addModule(string $module): self
{
$this->modules[] = $module;
return $this;
}
/**
* Ajoute un middleware
*
* @param string $middleware
* @return App
*/
public function pipe(string $middleware): self
{
$this->middlewares[] = $middleware;
return $this;
}
public function handle(ServerRequestInterface $request): ResponseInterface
{
$middleware = $this->getMiddleware();
if (is_null($middleware)) {
throw new \Exception('Aucun middleware n\'a intercepté cette requête');
} elseif (is_callable($middleware)) {
return call_user_func_array($middleware, [$request, [$this, 'handle']]);
} elseif ($middleware instanceof MiddlewareInterface) {
return $middleware->handle($request, $this);
}
}
public function run(ServerRequestInterface $request): ResponseInterface
{
foreach ($this->modules as $module) {
$this->getContainer()->get($module);
}
return $this->handle($request);
}
/**
* @return ContainerInterface
* @throws \Exception
*/
private function getContainer(): ContainerInterface
{
if ($this->container === null) {
$builder = new ContainerBuilder();
$builder->addDefinitions($this->definition);
foreach ($this->modules as $module) {
if ($module::DEFINITIONS) {
$builder->addDefinitions($module::DEFINITIONS);
}
}
$this->container = $builder->build();
}
return $this->container;
}
/**
* @return object
*/
private function getMiddleware()
{
if (array_key_exists($this->index, $this->middlewares)) {
var_dump($this->container);
$middleware = $this->container->make($this->middlewares[$this->index]);
$this->index++;
return $middleware;
}
return null;
}
}
et index.php:
<?php
use App\Admin\AdminModule;
use App\Blog\BlogModule;
use Framework\Middleware\{
DispatcherMiddleware,
MethodMiddleware,
RouterMiddleware,
TrailingSlashMiddleware,
NotFoundMiddleware
};
use GuzzleHttp\Psr7\ServerRequest;
use Middlewares\Whoops;
require dirname(__DIR__) . '/vendor/autoload.php';
$modules = [
AdminModule::class,
BlogModule::class
];
$app = (new \Framework\App(dirname(__DIR__) . '/config/config.php'))
->addModule(AdminModule::class)
->addModule(BlogModule::class)
//->pipe(Whoops::class)
->pipe(TrailingSlashMiddleware::class)
->pipe(MethodMiddleware::class)
->pipe(RouterMiddleware::class)
->pipe(DispatcherMiddleware::class)
->pipe(NotFoundMiddleware::class);
if (php_sapi_name() !== "cli") {
$response = $app->run(ServerRequest::fromGlobals());
\Http\Response\send($response);
}
A noter que le MiddlewareInterface vient du psr et j'injecte RequestHandlerInterface au lieu de DelegateInterface.