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)
正如您所展示的,您可以通过小组来做到这一点。也许更优雅的解决方案是实现您自己的ExclusionStrategy。@Groups和其他也是 ExclusionStrategyInterface 的实现。
因此,假设您将策略称为SelectFieldsStrategy。一旦实现它,您就可以非常轻松地将其添加到序列化上下文中:
$context = new SerializationContext();
$context->addExclusionStrategy(new SelectFieldsStrategy(['id', 'name', 'someotherfield']));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
408 次 |
最近记录: |