I want to use two parameters within a fast route in zend expressive / laminas mezzio.
routes.php
$app->get('/api/users/{userId:\d+}/pages/[{id:\d+}]', [App\Page\PageHandler::class], 'api.pages');
ConfigProvider.php
[
'__class__' => RouteBasedResourceMetadata::class,
'resource_class' => Page\PageEntity::class,
'route' => 'api.page',
'extractor' => ObjectPropertyHydrator::class,
],
[
'__class__' => RouteBasedCollectionMetadata::class,
'collection_class' => Page\PageCollection::class,
'collection_relation' => 'pages',
'route' => 'api.pages',
],
This error occurs:
Route `api.page` expects at least parameter values for [userId,id], but received [id]
There is a problem with the mapping...
How can I add a second paramtere in de Metadata Mapping? I thought there would be an auto-mapping...
I guess the path configuration in the routes.php is faulty. Try this:
In the handle function you can easily access
userIdandidvia getAttributes function of the$requestobject:The configuration in the ConfigProvider is not necessary for this.
If you want that getAttribute returns directly the corresponding entity objects and not the IDs, I would recommend you to use a middleware for it, which uses
userIdandidin order to loads the desired objects from the database or any other data source.The following example uses Doctrine:
Create a Factory for the middleware and register it in the ConfigProvider. Also register this middleware in
pipeline.phpafterRouteMiddleware:Now you can access the objects in the handler method: