Symfony - FOSRestBundle - 显示选定的字段

时间:2015-10-14 13:33:20

标签: symfony fosrestbundle jmsserializerbundle

我试图在控制器中的REST操作中仅显示选定的字段。 我找到了一个解决方案 - 我可以在实体/模型中设置组,并在我的控制器中的注释上方选择此组。

但实际上我不想要使用群组,我想确定我想要曝光哪些字段。

我看到一个解决方案 - 我可以为我的实体/模型中的每个字段创建一个组。像这样:

class User
{
    /**
     * @var integer
     *
     * @Groups({"entity_user_id"})
     */
    protected $id;

    /**
     * @var string
     *
     * @Groups({"entity_user_firstName"})
     */
    protected $firstName;

    /**
     * @var string
     *
     * @Groups({"entity_user_lastName"})
     */
    protected $lastName;
}

然后我可以列出控制器操作上方的字段。

我的问题是:

  1. 我可以为此使用更好的解决方案吗?

  2. 我可以列出所有群组吗?就像我可以列出所有路线或所有服务一样。

1 个答案:

答案 0 :(得分:1)

这主要是关于序列化而不是关于fosrestbundle本身。

正确的方法是创建自己的现场序列化策略。 这篇文章很好地说明了:

http://jolicode.com/blog/how-to-implement-your-own-fields-inclusion-rules-with-jms-serializer

它构建了一个自定义排除策略,如下所述:

How do I create a custom exclusion strategy for JMS Serializer that allows me to make run-time decisions about whether to include a particular field?

来自第一个链接的示例代码供参考:

自定义FieldExclusion策略:

namespace Acme\Bundle\ApiBundle\Serializer\Exclusion;

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

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

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

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

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

        $name = $property->serializedName ?: $property->name;

        return !in_array($name, $this->fields);
    }
}

接口

interface ExclusionStrategyInterface
{
    public function shouldSkipClass(ClassMetadata $metadata, Context $context);
    public function shouldSkipProperty(PropertyMetadata $property, Context $context);
}

使用

在控制器或您需要的地方:

$context = new SerializationContext();
$fieldList = ['id', 'title']; // fields to return    
$context->addExclusionStrategy(
    new FieldsListExclusionStrategy($fieldList)
);

// serialization
$serializer->serialize(new Pony(), 'json', $context);

你也应该能够与群体混合搭配,例如。您还可以将$content->setGroups(['myGroup'])与fieldExclusio

一起设置