最佳实践-相同的路径,不同的性能输出-根据客户的需求SF4包括/排除/计算字段

问题描述 投票:-1回答:1

我正在Symfony 4.4中构建基于RESTful / RPC的API,并且我希望某些终结点返回已处理的数据,这些数据将限制返回的关联或包含嵌入其中的自定义统计信息字段。 (我想在客户端应用中显示我的用户)

有几种方法可以解决此问题,但我想知道是否有一些建议可以建议更合适/最佳实践的方法。

[列出实体时,出于性能原因,我希望指定一个视图,JSON数据应位于其中,并且我可以在文档中使用一些预设的视图类型

问题:列出具有统计信息的详细视图的实体,或仅列出下拉选择器的列表->它们是相同的[[控制器索引路径,但输出应出于性能原因而有所不同] >。例如:我正在运行一个基于体育赛事的参与系统。 *我想列出所有添加了付费“订单”的“事件”,并且在应用程序的另一部分中,我只想要所有事件的名称,而无需任何统计信息或深度扩展的关联。

解决方案1

:我可以通过返回一个对象(根据查询参数来自定义所有字段)来实现在控制器中,但是我的控制器变得非常胖,因为列出所有必填字段可以每个对象20-30个字段。 (基本上放弃了基于实体类型自动执行序列化的好处)return [ [ 'id' => $event->getId(), 'name' => $event->getName(), ... 'order_count' => $orderRepository->getOrderCountForEvent($event->getId()) ], ... ]

解决方案2

:我可以为要返回的不同视图和过滤器定义转换函数在存储库中public function transform(Event $event, $type = 'shortlist') { $view = null; switch($type) { case 'shortlist': $view = [ 'id' => $event->getId(), 'name' => $event->getName(), 'participants' => $orderRepository->getOrderCountForEvent($event->getId()), ... ]; break; default: ... // all fields break } return $view; }
有更好的解决方案吗?我听说过DTO-s,但是我不确定这是Symfony中最好的方法。我也听说过将.twig模板渲染为json,但是找不到很好的信息。大多数人似乎使用Symfony运行全栈应用程序。 

是否有与此相关的良好做法?我将非常感谢-对于这个复杂的问题深表歉意,也许我不是在问正确的问题,需要更好地指定我的应用。

[我正在Symfony 4.4中构建基于RESTful / RPC的API,并且我希望某些端点返回已处理的数据,这些数据限制了返回的关联或包含嵌入在...中的自定义统计信息字段]]

也许您正在寻找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
symfony symfony4 fosrestbundle
1个回答
0
投票
也许您正在寻找Symfony序列化程序,它具有选择要渲染的字段的功能。
© www.soinside.com 2019 - 2024. All rights reserved.