FOSRestBundle:在请求中询问的属性的部分响应

GG.*_*GG. 6 php api symfony fosrestbundle jmsserializerbundle

上下文

我发现了许多关于使用FOSRest进行部分API响应的问题,所有答案都基于JMS序列化程序选项(exlude,include,groups等).它工作正常,但我试图实现一些不那么"静态"的东西.

假设我有一个具有以下属性的用户: id username firstname lastname age sex

我使用端点GET /users/{id}和以下方法检索此用户:

/**
 * @View
 *
 * GET /users/{id}
 * @param integer $user (uses ParamConverter)
 */
public function getUserAction(User $user) {
    return $user;
}
Run Code Online (Sandbox Code Playgroud)

该方法返回用户的所有属性.

现在我想允许这样的事情: GET /users/{id}?attributes=id,username,sex

我是否错过了FOSRestBUndle,JMSserializer或SensioFrameworkExtraBundle的功能来自动实现它?请求中的注释,方法,关键字或其他内容?

否则,实现它的最佳方法是什么?

我想做类似的事情:

/**
 * @View
 * @QueryParam(name="attributes")
 *
 * GET /users/{id}
 *
 * @param integer $user (uses ParamConverter)
 */
public function getUserAction(User $user, $attributes) {
    $groups = $attributes ? explode(",", $attributes) : array("Default");

    $view = $this->view($user, 200)
        ->setSerializationContext(SerializationContext::create()->setGroups($groups));

    return $this->handleView($view);
}
Run Code Online (Sandbox Code Playgroud)

并为每个属性创建一个组:

use JMS\Serializer\Annotation\Groups;

class User {

    /** @Groups({"id"}) */
    protected $id;

    /** @Groups({"username"}) */
    protected $username;

    /** @Groups({"firstname"}) */
    protected $firstname;

    //etc
}
Run Code Online (Sandbox Code Playgroud)

Igo*_*vić 3

正如您所展示的,您可以通过小组来做到这一点。也许更优雅的解决方案是实现您自己的ExclusionStrategy@Groups和其他也是 ExclusionStrategyInterface 的实现。

因此,假设您将策略称为SelectFieldsStrategy。一旦实现它,您就可以非常轻松地将其添加到序列化上下文中:

$context = new SerializationContext();
$context->addExclusionStrategy(new SelectFieldsStrategy(['id', 'name', 'someotherfield']));
Run Code Online (Sandbox Code Playgroud)