我想在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',
],出现以下错误:
Route `api.page` expects at least parameter values for [userId,id], but received [id]映射有一个问题...
如何在de Metadata Mapping中添加第二个参数?我以为会有一个自动映射..。
发布于 2020-10-22 02:05:31
我猜routes.php中的路径配置有问题。试试这个:
$app->get('/api/pages/{id:\d+}/users/{userId:\d+}', App\Page\PageHandler::class, 'api.pages');在handle函数中,您可以通过$request对象的getAttributes函数轻松访问userId和id:
public function handle(ServerRequestInterface $request) : ResponseInterface
{
$userId = (int)$request->getAttribute('userId');
$id = (int)$request->getAttribute('id');
}为此,不需要在ConfigProvider中进行配置。
如果您希望getAttribute直接返回相应的实体对象,而不是in,我建议您使用一个中间件,它使用userId和id从数据库或任何其他数据源加载所需的对象。
以下示例使用Doctrine:
<?php
namespace App\Middleware;
class GetEntitiesFromQueryParamsMiddleware implements MiddlewareInterface
{
private $entityManager;
public function __construct(EntityManagerInterface $entityManager
{
$this->entityManager = $entityManager;
}
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$pageId = (int)$request->getAttribute('id');
$page = $this->entityManager
->getRepository(PageEntity::class)
->find($pageId);
$userId = (int)$request->getAttribute('userId');
$user = $this->entityManager
->getRepository(User::class)
->find($id);
return $handler->handle($request
->withAttribute(PageEntity::class, $page)
->withAttribute(User::class, $user));
}
}为中间件创建一个工厂并在ConfigProvider中注册它。在RouteMiddleware之后,还要在pipeline.php中注册这个中间件
...
$app->pipe(RouteMiddleware::class);
$app->pipe('/api/pages', GetEntitiesFromQueryParamsMiddleware::class);
...现在,您可以访问处理程序方法中的对象:
class PageHandler
{
public function handle(ServerRequestInterface $request) : ResponseInterface
{
$page = $request->getAttribute(PageEntity::class);
$user = $request->getAttribute(User::class);
}
}https://stackoverflow.com/questions/60395509
复制相似问题