FOS REST 捆绑包上的动态序列化组

Sou*_*euh 6 rest symfony fosrestbundle

我目前正在使用FOSRESTBundleJMSSerialize来制作 RESTFull API(当然)。

我的项目是一个供客户和管理员使用的外联网。

这样,我必须禁止客户查看某些字段,仅对管理员可见。

我首先为实体进行了序列化器配置:

AppBundle\Entity\IncidentComment:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
            groups: [list, details]
        author:
            expose: true
            groups: [list, details]
        addedAt:
            expose: true
            groups: [list, details]
        content:
            expose: true
            groups: [details]
        customerVisible:
            expose: true
            groups: [list_admin, details_admin]
Run Code Online (Sandbox Code Playgroud)

如您所见,customerVisible组有_admin后缀。该字段应仅对管理员显示。

_admin如果用户具有例如 ROLE_ADMIN 角色或其他条件,我想动态添加带有后缀的组来在视图上设置组,而不将其写入每个其余控制器的每个操作上。

我正在考虑创建一个带有安全上下文参数的自定义视图处理程序来添加组,但我不知道这是否是正确的方法。

你认为这是好方法吗?您对此有什么建议吗?

顺便说一句,如果某些开发人员遇到同样的问题,我会很高兴看到他如何解决它!:)

谢谢。

Tho*_*her 4

我刚刚找到了一种在运行时添加 SerializerGroups 的简单方法:

private function determineRolebasedSerializerGroup($role, $groupToAdd, Request $request) {
    if (!$this->get('security.context')->isGranted($role))
        return;

    $groups = $request->attributes->get('_view')->getSerializerGroups();
    $groups[] = $groupToAdd;
    $x = $request->attributes->get('_view')->setSerializerGroups($groups);
}
Run Code Online (Sandbox Code Playgroud)

我已将此方法添加到我的控制器中。我现在可以这样称呼它:

/**
 * @REST\View(serializerGroups={"company"})
 */
public function getCompanyAction(Company $company, Request $request) {
    $this->determineRolebasedSerializerGroup('ROLE_ADMIN', 'company-admin', $request);

    return $company;
}
Run Code Online (Sandbox Code Playgroud)

如果当前用户具有“ROLE_ADMIN”角色,则会将“company-admin”组添加到序列化器组中。这对我来说效果很好。

  • 属性->get('_view) 返回 null (2认同)