首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend Expressive / Laminas Mezzio - Route至少需要参数值

Zend Expressive / Laminas Mezzio - Route至少需要参数值
EN

Stack Overflow用户
提问于 2020-02-25 21:15:24
回答 1查看 164关注 0票数 1

我想在zend expressive / laminas mezzio中的快速路由中使用两个参数。

routes.php

代码语言:javascript
复制
$app->get('/api/users/{userId:\d+}/pages/[{id:\d+}]', [App\Page\PageHandler::class], 'api.pages');

ConfigProvider.php

代码语言:javascript
复制
 [
        '__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',
  ],

出现以下错误:

代码语言:javascript
复制
Route `api.page` expects at least parameter values for [userId,id], but received [id]

映射有一个问题...

如何在de Metadata Mapping中添加第二个参数?我以为会有一个自动映射..。

EN

回答 1

Stack Overflow用户

发布于 2020-10-22 02:05:31

我猜routes.php中的路径配置有问题。试试这个:

代码语言:javascript
复制
$app->get('/api/pages/{id:\d+}/users/{userId:\d+}', App\Page\PageHandler::class, 'api.pages');

在handle函数中,您可以通过$request对象的getAttributes函数轻松访问userIdid

代码语言:javascript
复制
public function handle(ServerRequestInterface $request) : ResponseInterface
{
    $userId = (int)$request->getAttribute('userId');
    $id = (int)$request->getAttribute('id');
}

为此,不需要在ConfigProvider中进行配置。

如果您希望getAttribute直接返回相应的实体对象,而不是in,我建议您使用一个中间件,它使用userIdid从数据库或任何其他数据源加载所需的对象。

以下示例使用Doctrine:

代码语言:javascript
复制
<?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中注册这个中间件

代码语言:javascript
复制
...
$app->pipe(RouteMiddleware::class);
$app->pipe('/api/pages', GetEntitiesFromQueryParamsMiddleware::class);
...

现在,您可以访问处理程序方法中的对象:

代码语言:javascript
复制
class PageHandler 
{

    public function handle(ServerRequestInterface $request) : ResponseInterface
    {
        $page = $request->getAttribute(PageEntity::class);
        $user = $request->getAttribute(User::class);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60395509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档