Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 28 |
RegisterSerializationClassesCompilerPass | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
110 | |
0.00% |
0 / 28 |
process | |
0.00% |
0 / 1 |
72 | |
0.00% |
0 / 21 |
|||
sort | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 7 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\serialization\RegisterSerializationClassesCompilerPass. | |
*/ | |
namespace Drupal\serialization; | |
use Symfony\Component\DependencyInjection\Reference; | |
use Symfony\Component\DependencyInjection\ContainerBuilder; | |
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; | |
/** | |
* Adds services tagged 'normalizer' and 'encoder' to the Serializer. | |
*/ | |
class RegisterSerializationClassesCompilerPass implements CompilerPassInterface { | |
/** | |
* Adds services to the Serializer. | |
* | |
* @param \Symfony\Component\DependencyInjection\ContainerBuilder $container | |
* The container to process. | |
*/ | |
public function process(ContainerBuilder $container) { | |
$definition = $container->getDefinition('serializer'); | |
// Retrieve registered Normalizers and Encoders from the container. | |
foreach ($container->findTaggedServiceIds('normalizer') as $id => $attributes) { | |
$priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0; | |
$normalizers[$priority][] = new Reference($id); | |
} | |
foreach ($container->findTaggedServiceIds('encoder') as $id => $attributes) { | |
$priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0; | |
$encoders[$priority][] = new Reference($id); | |
} | |
// Add the registered Normalizers and Encoders to the Serializer. | |
if (!empty($normalizers)) { | |
$definition->replaceArgument(0, $this->sort($normalizers)); | |
} | |
if (!empty($encoders)) { | |
$definition->replaceArgument(1, $this->sort($encoders)); | |
} | |
// Find all serialization formats known. | |
$formats = array(); | |
foreach ($container->findTaggedServiceIds('encoder') as $attributes) { | |
$formats[] = $attributes[0]['format']; | |
} | |
$container->setParameter('serializer.formats', $formats); | |
} | |
/** | |
* Sorts by priority. | |
* | |
* Order services from highest priority number to lowest (reverse sorting). | |
* | |
* @param array $services | |
* A nested array keyed on priority number. For each priority number, the | |
* value is an array of Symfony\Component\DependencyInjection\Reference | |
* objects, each a reference to a normalizer or encoder service. | |
* | |
* @return array | |
* A flattened array of Reference objects from $services, ordered from high | |
* to low priority. | |
*/ | |
protected function sort($services) { | |
$sorted = array(); | |
krsort($services); | |
// Flatten the array. | |
foreach ($services as $a) { | |
$sorted = array_merge($sorted, $a); | |
} | |
return $sorted; | |
} | |
} |