我正在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,并且我希望某些端点返回已处理的数据,这些数据限制了返回的关联或包含嵌入在...中的自定义统计信息字段]]
来自文档的示例:
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