如何从查询字符串映射日期?

问题描述 投票:0回答:1

我有一个 symfony API 端点,如下所示:

/orders/list-all?since=2024-10-21

我想将该查询字符串参数映射到 DateTimeImmutable (或 DateTimeInterface),如下所示:

    public function listOrders(
        #[OA\QueryParameter(name: 'since', in: 'query', description: 'Date de début de la recherche', required: false, schema: new OA\Schema(type: 'string', format: 'date'))]
        #[MapQueryParameter()]
        ?DateTimeInterface $since = null
    ): Response

但这似乎不起作用。 我看过:

  • 日期时间值解析器
  • MapDateTime(这将允许我指定日期格式)

但我不明白它们应该如何工作,并且文档在这方面的内容非常少。

通过阅读和调试 DateTimeValueResolver 源代码,我发现

$request->attributes->has($argument->getName())
始终为 false。

有没有任何示例用法?

symfony symfony6
1个回答
0
投票

您不能将

MapQueryParameter
array
string
int
float
bool
\BackedEnum
以外的类型一起使用。

您可以做的就是接受

since
作为字符串类型,然后创建一个
DateTimeImmutable

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\Attribute\MapQueryParameter;
use Symfony\Component\Routing\Attribute\Route;

final class TestController extends AbstractController
{
    #[Route(path: '/list', name: 'get-list')]
    public function getListAction(
        #[MapQueryParameter]
        ?string $since = null,
    )
    {
        $date = \DateTimeImmutable::createFromFormat('Y-m-d', $since);
        dd($date);
    }
}

MapDateTime
$request->attributes
获取数据,而不是从
$request->query
获取数据,其中
since
参数所在。

所以现在,我认为你需要坚持上述逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.