最佳实践 - 如何响应不同的实体视图以提高 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