我试图在控制器中的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;
}
然后我可以列出控制器操作上方的字段。
我的问题是:
我可以为此使用更好的解决方案吗?
我可以列出所有群组吗?就像我可以列出所有路线或所有服务一样。
答案 0 :(得分:1)
这主要是关于序列化而不是关于fosrestbundle本身。
正确的方法是创建自己的现场序列化策略。 这篇文章很好地说明了:
http://jolicode.com/blog/how-to-implement-your-own-fields-inclusion-rules-with-jms-serializer
它构建了一个自定义排除策略,如下所述:
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