EDIT: этот ответ охватывает только первоначальный вопрос, который не требует более глубоких уровней сериализации. Я все равно сохраню его, так как это может помочь другим, которые также борются с этим первоначальным вопросом.
Мы сделали то же самое довольно общим способом.
Мы расширили ViewHandler для чтения из текущего Request, если «поля» были прикреплены в качестве параметра, и добавили ExclusionStrategy в Контекст сериализации.
Стоит отметить, что этот подход работает с FOS Rest Bundle 1.7.7 (мы пока не перешли на новейшую версию JMS), Symfony > 2.8 и JMSSerializerBundle 1.1.0, но миграция не должна быть слишком сложной. этот подход к любой другой комбинации, а также.
class ViewHandler extends \FOS\RestBundle\View\ViewHandler
{
/**
* Extends ViewHandler, adds the exclusion strategies FieldListExclusionStrategy to the SerializationContext.
*
* Reads Request Parameter "fields" (comma separated list) and parses it into an array. Does some clean-up on parameter
*/
protected function getSerializationContext(View $view)
{
$context = $view->getSerializationContext();
$request = $this->container->get('request_stack')->getCurrentRequest();
if ($request->isMethod('GET') && $request->query->has('fields')) {
$fieldList = explode(',', $request->query->get('fields'));
array_walk($fieldList, array(&$this, 'cleanString')); //clean special characters except - and _
$fieldList = array_filter($fieldList); // remove empty elements
$context->addExclusionStrategy(new FieldListExclusionStrategy($fieldList));
}
$view->setSerializationContext($context);
return parent::getSerializationContext($view);
}
/**
* Helper to remove special characters from String, Compatible with array_walk
*
* @param string $string -
* @param mixed $key -needed to be compatible with array_walk without raising a notice. (hands in 2 parameters)
*
* @return mixed
*/
private function cleanString(&$string, $key)
{
$string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
$string = preg_replace('/[^A-Za-z0-9\-\_]/', '', $string); // Removes special chars.
return preg_replace('/-+/', '-', $string); // Replaces multiple hyphens with single one.
}
}
А это класс FieldListExclusionStrategy:
class FieldListExclusionStrategy implements ExclusionStrategyInterface
{
/**
* @var array
*/
private $fields = array();
/**
* @var int
*/
private $maxDepth;
/**
* FieldListExclusionStrategy constructor.
*
* @param array $fields
*/
public function __construct(array $fields)
{
$this->maxDepth = 1;
$this->fields = $fields;
}
/**
* Whether the class should be skipped.
*
* @param ClassMetadata $metadata
* @param Context $context
* @return boolean
*/
public function shouldSkipClass(ClassMetadata $metadata, Context $context)
{
return false;
}
/**
* Whether the property should be skipped.
*
* @param PropertyMetadata $property
* @param Context $context
*
* @return boolean
*/
public function shouldSkipProperty(PropertyMetadata $property, Context $context)
{
if (0 === count($this->fields)) {
return false;
}
if ($context->getDepth() > $this->maxDepth) {
return false;
}
$name = $property->serializedName ?: $property->name;
return !in_array($name, $this->fields, true);
}
}
person
LBA
schedule
19.10.2016