【问题标题】:JMSSerializer — Exclude Properties by conditionJMSSerializer — 按条件排除属性
【发布时间】:2017-02-24 11:09:12
【问题描述】:

我已经创建了一个像这样的 Symfony3 实体(缩短):

class Group
{
  /**
   * …
   */
  private name;

  /**
   * …
   *@JMS\Exclude()
   */
  private $styles;
}

[GET] list/groups 路线上,这很好,因为它应该生成一个列表,其中包含每个项目应该只包含 id 和名称的位置。

但是在[GET] group/{id}的路线上,我想向客户提供更多细节,包括样式等等。

如何按条件/路由排除/包含实体的属性?

更新

感谢@Genoud Magloire 的回答,我可以做到这样:

use FOS\RestBundle\Context\Context;

$view = $this->view($group);
$context = new Context();
$context->addGroup('detail');
$view->setContext($context);

return $this->handleView($view);

【问题讨论】:

    标签: symfony jmsserializerbundle


    【解决方案1】:

    您可以使用@Group 注释作为解释Here 来创建对象的不同视图。

    【讨论】:

    • 谢谢,成功了!
    【解决方案2】:

    v1.5 版本中提供的另一种方法是按表达式语言排除。

    访问https://github.com/schmittjoh/serializer/pull/673,您可以了解如何使用任何服务调用来排除属性。

    基本上是:

    class Person
    {
        /**
         * @Expose(if="service('some.cool.service').isAllowed(object)")
         */
        public $gender;
        /**
         * @Exclude(if="service('some.cool.service').isAllowed(object)")
         */
        public $gender;
    }
    

    【讨论】:

    • 你能提供一个没有服务的例子吗?我找不到此功能的任何示例,除了“true”之类的表达式或一些虚拟方法。
    • 在"if"里面你可以放symfony.com/doc/current/components/expression_language.html上显示的任何表达式
    • 谢谢。我已经阅读了这篇文章。我的问题是 JMS Serializer 的组合。例如,如何检查表达式中的当前深度(访问上下文);或者如何检查其他属性(访问当前对象)。在documentation 中有这个例子:@Exclude(if="someMethod(object, context, property_metadata)")。但是没有信息我们如何/在哪里可以定义这个函数。
    • 正如我所尝试的,不能直接在表达式中使用对象、上下文和 property_metadata。
    • 你是通过 symfony bundle 使用它吗?如果没有,你必须自己实现github.com/schmittjoh/JMSSerializerBundle/blob/master/…
    猜你喜欢
    • 2022-07-05
    • 2015-08-25
    • 1970-01-01
    • 2018-11-19
    • 2021-10-22
    • 2018-02-09
    • 1970-01-01
    • 2012-12-05
    • 2014-05-06
    相关资源
    最近更新 更多