gpt4 book ai didi

php - FOSRestBundle:请求中要求的属性函数的部分响应

转载 作者:可可西里 更新时间:2023-11-01 13:19:19 25 4
gpt4 key购买 nike

上下文

我发现了很多关于使用 FOSRest 进行部分 API 响应的问题,所有答案都基于 JMS 序列化程序选项(排除、包含、组等)。它工作正常,但我尝试实现一些不那么“静态”的东西。

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

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

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

该方法返回用户及其所有属性。

现在我想允许这样的事情: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);
}

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

use JMS\Serializer\Annotation\Groups;

class User {

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

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

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

//etc
}

最佳答案

我的实现基于Igor's answer :

排除策略:

use JMS\Serializer\Exclusion\ExclusionStrategyInterface;
use JMS\Serializer\Metadata\ClassMetadata;
use JMS\Serializer\Metadata\PropertyMetadata;
use JMS\Serializer\Context;

class FieldsExclusionStrategy implements ExclusionStrategyInterface {
private $fields = array();

public function __construct(array $fields) {
$this->fields = $fields;
}

public function shouldSkipClass(ClassMetadata $metadata, Context $navigatorContext) {
return false;
}

public function shouldSkipProperty(PropertyMetadata $property, Context $navigatorContext) {
if (empty($this->fields)) {
return false;
}

if (in_array($property->name, $this->fields)) {
return false;
}

return true;
}
}

Controller :

/**
* @View
* @QueryParam(name="fields")
*
* GET /users/{id}
*
* @param integer $user (uses ParamConverter)
*/
public function getUserAction(User $user, $fields) {
$context = new SerializationContext();
$context->addExclusionStrategy(new FieldsExclusionStrategy($fields ? explode(',', $fields) : array()));

return $this->handleView($this->view($user)->setSerializationContext($context));
}

端点:

GET /users/{id}?fields=id,username,sex

关于php - FOSRestBundle:请求中要求的属性函数的部分响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27421354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com