gpt4 book ai didi

api-platform.com - API平台-在没有实体的情况下应使用哪种方法来创建自定义操作

转载 作者:行者123 更新时间:2023-12-03 16:13:07 25 4
gpt4 key购买 nike

我是API平台的新手。我认为这很棒,但是我找不到如何创建不基于任何实体的自定义终结点的示例。有很多基于实体的示例,通常它们都是关于CRUD的。但是自定义操作呢?

我需要使用一些与任何实体都不相关的自定义参数来通过数据库创建自定义搜索。
例如。我想收到类似这样的POST请求:

{
"from": "Paris",
"to": "Berlin"
}

此数据未保存到db,我也没有实体。
收到此数据后,应该有很多业务逻辑,包括通过许多数据库表进行数据库查询,以及从外部源获取数据。
然后,在业务逻辑完成之后,我想返回结果,该结果也是自定义的,并且与任何实体都不相关。
例如。
{
"flights": [/* a lot of json data*/],
"airports": [/* a lot of json data*/],
"cities": [/* a lot of json data*/],
.......
}

因此,我认为不是谁做类似事情的唯一人。但是我真的找不到解决方案或最佳做法。
在文档中,我至少找到了三种方法,但我都无法实现。
最好的,我想最适合我的是使用自定义操作和 Controller 。但是文档说不建议这样做。另外,我认为我应该使用DTO进行请求和响应,但是对于这种方法,我不确定是否可以使用它们。

我发现第二个对象使用的是数据传输对象,但是这种方法需要一个实体。根据文档,我应该使用DTO和DataTransformers将DTO转换为实体。但是我不需要实体,也不需要将其保存到数据库。我只想自己处理收到的DTO。

我猜第三个正在使用数据提供程序,但是我不确定它是否适合我的要求。

因此,主要问题是我应该使用哪种方法或最佳实践来实现与任何实体都不相关的自定义操作。 DTO用于请求和响应将非常有用。

最佳答案

您没有被迫使用实体。用@ApiResource批注标记的类可能不是实体。实际上,如果您的应用程序比基本的CRUD更智能,则应避免将实体标记为ApiResource。

由于您要使用POST HTTP方法(用于创建资源项目),因此可以执行以下操作。

1)定义描述搜索字段的类,该类将成为您的@ApiResource

<?php
// src/ApiResource/Search.php

namespace App\ApiResource;

use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Action\NotFoundAction;
use ApiPlatform\Core\Annotation\ApiProperty;
use App\Dto\SearchResult;

/**
* @ApiResource(
* itemOperations={
* "get"={
* "controller"=NotFoundAction::class,
* "read"=true,
* "output"=false,
* },
* },
* output=SearchResult::class
* )
*/
class Search
{
/**
* @var string
* @ApiProperty(identifier=true)
*/
public $from;

/** @var string */
public $to;
}

2)定义将代表输出的DTO
<?php
// src/Dto/SearchResult.php

namespace App\Dto;

class SearchResult
{
public $flights;
public $airports;
public $cities;
}

3)创建一个将添加 DataPersisterInterface来处理业务逻辑的类。
因为您发出POST请求,所以框架会调用它。
<?php
// src/DataPersister/SearchService.php

declare(strict_types=1);

namespace App\DataPersister;

use ApiPlatform\Core\DataPersister\DataPersisterInterface;
use App\Dto\SearchResult;
use App\ApiResource\Search;

final class SearchService implements DataPersisterInterface
{
public function supports($data): bool
{
return $data instanceof Search;
}

public function persist($data)
{
// here you have access to your request via $data
$output = new SearchResult();
$output->flights = ['a lot of json data'];
$output->airports = ['a lot of json data'];
$output->cities = ['inputData' => $data];
return $output;
}

public function remove($data)
{
// this method just need to be presented
}
}

这样,您将根据请求接收结果。

关于api-platform.com - API平台-在没有实体的情况下应使用哪种方法来创建自定义操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58398351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com