Hello all,
I’ve just installed Zend Expressive 3 RC1 and I would like to know if I’m wrong on my comprehension of PSR-15.
The basic routes are :
$app->get('/', App\Handler\HomePageHandler::class, 'home');
$app->get('/api/ping', App\Handler\PingHandler::class, 'api.ping');
The registered middlewares for those routes implements RequestHandlerInterface, not MiddlewareInterface.
In this case, I think the classes implements RequestHandlerInterface because it returns directly a response.
return new HtmlResponse($this->template->render('app::home-page', $data));
return new JsonResponse(['ack' => time()]);
but I could have achieved the same thing with a class implementing MiddlewareInterface ?!
So if I don’t need to call another middleware I can use a class implementing RequestHandlerInterface otherwise MiddlewareInterface.
Am I wrong ?
Thanks
That’s exactly correct.
For the inner-most item of any pipeline, you want something that will be guaranteed to return a response. If that item does not need to call on the handler passed to it… it can itself be a request handler.
We recommend that you create request handlers for handling routes. You can still use middleware pipelines for routes as well; just make sure your request handler is the last item in the pipeline:
$app->post('/api/books', [
ProblemDetailsMiddleware::class,
SessionMiddleware::class,
AuthenticationMiddleware::class,
AuthorizationMiddleware::class,
BodyParamsMiddleware::class,
ValidationMiddleware::class,
CreateBookHandler::class, // <-- Request handler!
]);
The rule of thumb is:
- Is there any path through the class that will require delegating handling of the request? If so, it’s middleware.
- Can the class always produce a response on its own? If so, it’s a request handler.
1 Like