我有一个 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
但这似乎不起作用。 我看过:
但我不明白它们应该如何工作,并且文档在这方面的内容非常少。
通过阅读和调试 DateTimeValueResolver 源代码,我发现
$request->attributes->has($argument->getName())
始终为 false。
有没有任何示例用法?
您不能将
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
参数所在。
所以现在,我认为你需要坚持上述逻辑。