最佳实践 - 如何响应不同的实体视图以提高 RESTful API 中的性能 (Symfony 4)
Best practice - How to respond with different entity views to improve performance in a RESTful API (Symfony 4)
在使用 REST 索引端点列出时,出于性能原因,我希望有不同的输出。
ex: on the same GET path for CRUD indexing
- List of Entities with all associations
- List of Entities with some associations
- List of Entities with just some basic fields
这将用于列出实体以获得带有统计信息的详细视图,或仅列出实体以用于下拉选择器。
可能的解决方案 1:我可以 在控制器 中通过 return 自定义所有的对象来做到这一点基于查询参数的字段 - 但随后我的控制器变得非常胖,因为列出所有必需的字段可以是每个对象 20-30 个字段。 (基本上放弃了序列化程序根据实体类型自动执行此操作的好处)
return [
[
'id' => $event->getId(),
'name' => $event->getName(),
...
'order_count' => $orderRepository->getOrderCountForEvent($event->getId())
],
...
]
可能的解决方案 2:我可以在存储库 中为我想要的不同视图和过滤器定义转换函数return.
public function transform(Event $event, $type = 'shortlist')
{
$view = null;
switch($type) {
case 'shortlist':
$view = [
'id' => $event->getId(),
'name' => $event->getName(),
'participants' => $orderRepository->getParticipantCountForEvent($event->getId()),
...
];
break;
default:
... // all fields
break
}
return $view;
}
有没有更好/更清洁的解决方案?大多数教程只处理具有简单关系的简单实体,它们的 CRUD 实现非常基础,它们只是获取每个字段并将其传递给序列化程序。
也许您正在寻找 Symfony 序列化程序,它具有选择您呈现的字段的功能。
文档中的示例:
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
class User
{
public $familyName;
public $givenName;
public $company;
}
class Company
{
public $name;
public $address;
}
$company = new Company();
$company->name = 'Les-Tilleuls.coop';
$company->address = 'Lille, France';
$user = new User();
$user->familyName = 'Dunglas';
$user->givenName = 'Kévin';
$user->company = $company;
$serializer = new Serializer([new ObjectNormalizer()]);
$data = $serializer->normalize($user, null, [AbstractNormalizer::ATTRIBUTES => ['familyName', 'company' => ['name']]]);
// $data = ['familyName' => 'Dunglas', 'company' => ['name' => 'Les-Tilleuls.coop']];
在此处查看文档:https://symfony.com/doc/current/components/serializer.html#selecting-specific-attributes
在使用 REST 索引端点列出时,出于性能原因,我希望有不同的输出。
ex: on the same GET path for CRUD indexing
- List of Entities with all associations
- List of Entities with some associations
- List of Entities with just some basic fields
这将用于列出实体以获得带有统计信息的详细视图,或仅列出实体以用于下拉选择器。
可能的解决方案 1:我可以 在控制器 中通过 return 自定义所有的对象来做到这一点基于查询参数的字段 - 但随后我的控制器变得非常胖,因为列出所有必需的字段可以是每个对象 20-30 个字段。 (基本上放弃了序列化程序根据实体类型自动执行此操作的好处)
return [
[
'id' => $event->getId(),
'name' => $event->getName(),
...
'order_count' => $orderRepository->getOrderCountForEvent($event->getId())
],
...
]
可能的解决方案 2:我可以在存储库 中为我想要的不同视图和过滤器定义转换函数return.
public function transform(Event $event, $type = 'shortlist')
{
$view = null;
switch($type) {
case 'shortlist':
$view = [
'id' => $event->getId(),
'name' => $event->getName(),
'participants' => $orderRepository->getParticipantCountForEvent($event->getId()),
...
];
break;
default:
... // all fields
break
}
return $view;
}
有没有更好/更清洁的解决方案?大多数教程只处理具有简单关系的简单实体,它们的 CRUD 实现非常基础,它们只是获取每个字段并将其传递给序列化程序。
也许您正在寻找 Symfony 序列化程序,它具有选择您呈现的字段的功能。
文档中的示例:
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
class User
{
public $familyName;
public $givenName;
public $company;
}
class Company
{
public $name;
public $address;
}
$company = new Company();
$company->name = 'Les-Tilleuls.coop';
$company->address = 'Lille, France';
$user = new User();
$user->familyName = 'Dunglas';
$user->givenName = 'Kévin';
$user->company = $company;
$serializer = new Serializer([new ObjectNormalizer()]);
$data = $serializer->normalize($user, null, [AbstractNormalizer::ATTRIBUTES => ['familyName', 'company' => ['name']]]);
// $data = ['familyName' => 'Dunglas', 'company' => ['name' => 'Les-Tilleuls.coop']];
在此处查看文档:https://symfony.com/doc/current/components/serializer.html#selecting-specific-attributes