我需要创建一个GET端点来返回通过http客户端从另一个应用程序获取的资源,而不是基于实体。我获取的资源是一个数组:
[
"id" => 1234
"first_name" => ""
"last_name" => ""
"email" => ""
"country" => 1
"country_code" => 93
"phone_number" => "3434343"
"nationality" => "AF"
"professional_industry" => "Health Care"
"job_title" => "Medical Doctor - General Practitioner"
"specialisation" => "No specialisation"
"career_length_month" => 1
"career_length_year" => 1
]
然后我需要查询数据库以获取一些数据以添加到资源数组中。
我将它创建在src/Controller/MyController.php
:
/**
* @Route("/api/v1/get-profile", name="get_profile")
* @return JsonResponse
*/
public function getMemberInfo(): JsonResponse
{
// step 1 : use http client to request data from another application
// step 2 : query DB to fetch some data and add to data array
return new JsonResponse($data, Response::HTTP_OK);
}
但是现在,我希望我的api返回jsonapi响应格式:https://jsonapi.org/.
基于实体的资源,完全被api平台支持。我不需要做太多。我只是加上了"key"#[ApiResource]
在实体类和配置一些东西。然后我有一个json api格式的api,所以很容易:
{
"data": {
"id": "",
"type": "",
"attributes": {}
}
}
但是如果资源不是基于实体的呢?api平台是否有任何我可以使用的内置功能,或者我必须自己做一个转换器?
你需要重写文档中描述的OpenAPI规范:https://api-platform.com/docs/core/openapi/overriding-the-openapi-specification
然后,在新的类中,你必须添加你需要的模式定义,添加新的PathItem实例,每个PathItem需要新的Operation实例,等等。
抱歉没有粘贴示例,它需要这么多代码。我正在一个项目中使用这种方法,但目前还不公开。
希望我对你有帮助。
最好的做法是创建自定义数据提供程序。这个自定义数据提供程序将负责从外部源获取数据。然后,API-Platform将能够像使用常规实体一样使用它。
- API-Platform演示中的完整示例