8000 [ValueExporter] added support for formatters FQCN instead of instances · symfony/symfony@08d6b76 · GitHub
[go: up one dir, main page]

Skip to content

Commit 08d6b76

Browse files
committed
[ValueExporter] added support for formatters FQCN instead of instances
1 parent 6728a8a commit 08d6b76

File tree

3 files changed

+39
-20
lines changed

3 files changed

+39
-20
lines changed

src/Symfony/Component/ValueExporter/Exporter/AbstractValueExporter.php

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,26 @@ abstract class AbstractValueExporter implements ValueExporterInterface
3939
protected $formatterInterface = FormatterInterface::class;
4040

4141
/**
42-
* An array of arrays of formatters by priority.
42+
* An array of priorities by formatter class.
4343
*
4444
* @var array[]
4545
*/
4646
private $formatters = array();
4747

4848
/**
49-
* A sorted array of formatters.
49+
* An array of formatters instances sorted by priority or null.
5050
*
51-
* @var FormatterInterface[]
51+
* @var FormatterInterface[]|null
5252
*/
5353
private $sortedFormatters;
5454

55+
/**
56+
* An array of cached formatters instances by class.
57+
*
58+
* @var FormatterInterface[]
59+
*/
60+
private $cachedFormatters = array();
61+
5562
/**
5663
* Takes {@link FormatterInterface} as arguments.
5764
*
@@ -72,23 +79,19 @@ final public function addFormatters(array $formatters)
7279
foreach ($formatters as $formatter) {
7380
if (is_array($formatter)) {
7481
$priority = (int) $formatter[1];
75-
$formatter = $formatter[0];
82+
$formatterClass = $formatter[0];
7683
} else {
7784
$priority = 0;
85+
$formatterClass = $formatter;
7886
}
7987

80-
$formatterClass = get_class($formatter);
81-
82-
if (!$formatter instanceof $this->formatterInterface) {
88+
if (!in_array($this->formatterInterface, class_implements($formatterClass), true)) {
8389
throw new InvalidFormatterException($formatterClass, static::class, $this->formatterInterface);
8490
}
8591

86-
if (in_array(ExpandedFormatterTrait::class, class_uses($formatterClass), true)) {
87-
$formatter->setExporter($this);
88-
}
89-
90-
// Using the class as key prevents duplicate
91-
$this->formatters[$priority][$formatterClass] = $formatter;
92+
// Using the class as key prevents duplicate and allows to
93+
// dynamically change the priority
94+
$this->formatters[$formatterClass] = $priority;
9295
}
9396
}
9497

@@ -98,8 +101,24 @@ final public function addFormatters(array $formatters)
98101
final protected function formatters()
99102
{
100103
if (null === $this->sortedFormatters) {
101-
krsort($this->formatters);
102-
$this->sortedFormatters = call_user_func_array('array_merge', $this->formatters);
104+
arsort($this->formatters);
105+
106+
foreach (array_keys($this->formatters) as $formatterClass) {
107+
if (isset($this->cachedFormatters[$formatterClass])) {
108+
$this->sortedFormatters[] = $this->cachedFormatters[$formatterClass];
109+
110+
continue;
111+
}
112+
113+
$formatter = new $formatterClass();
114+
115+
if (in_array(ExpandedFormatterTrait::class, class_uses($formatterClass), true)) {
116+
/** @var ExpandedFormatterTrait $formatter */
117+
$formatter->setExporter($this);
118+
}
119+
120+
$this->sortedFormatters[] = $this->cachedFormatters[$formatterClass] = $formatter;
121+
}
103122
}
104123

105124
return $this->sortedFormatters;

src/Symfony/Component/ValueExporter/Tests/ValueExporterTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function testExportValueExpanded()
5252

5353
public function testExportTraversable()
5454
{
55-
ValueExporter::addFormatters(array(new TraversableToStringFormatter()));
55+
ValueExporter::addFormatters(array(TraversableToStringFormatter::class));
5656

5757
$value = new TraversableInstance();
5858
$exportedValue = <<<EOT

src/Symfony/Component/ValueExporter/ValueExporter.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ public static function export($value, $depth = 1, $expand = false)
3636
{
3737
if (null === self::$handler) {
3838
$exporter = self::$exporter ?: new ValueToStringExporter(
39-
new CallableToStringFormatter(),
40-
new DateTimeToStringFormatter(),
41-
new EntityToStringFormatter(),
42-
new PhpIncompleteClassToStringFormatter()
39+
CallableToStringFormatter::class,
40+
DateTimeToStringFormatter::class,
41+
EntityToStringFormatter::class,
42+
PhpIncompleteClassToStringFormatter::class
4343
);
4444
$exporter->addFormatters(self::$formatters);
4545
// Clear formatters

0 commit comments

Comments
 (0)
0