diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_transports.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_transports.php
index b7a6e408c3..4edc0d880a 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_transports.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_transports.php
@@ -3,7 +3,7 @@
$container->loadFromExtension('framework', array(
'serializer' => true,
'messenger' => array(
- 'serializer' => 'serializer: messenger.transport.symfony_serializer',
+ 'serializer' => 'messenger.transport.symfony_serializer',
'transports' => array(
'default' => 'amqp://localhost/%2f/messages',
'customised' => array(
diff --git a/src/Symfony/Bundle/TwigBundle/Resources/views/exception.css.twig b/src/Symfony/Bundle/TwigBundle/Resources/views/exception.css.twig
index 4556749de8..a2091e85aa 100644
--- a/src/Symfony/Bundle/TwigBundle/Resources/views/exception.css.twig
+++ b/src/Symfony/Bundle/TwigBundle/Resources/views/exception.css.twig
@@ -84,16 +84,15 @@ thead.sf-toggle-content.sf-toggle-visible, tbody.sf-toggle-content.sf-toggle-vis
.sf-toggle-off .icon-open, .sf-toggle-on .icon-close { display: block; }
.tab-navigation { margin: 0 0 1em 0; padding: 0; }
-.tab-navigation li { background: #FFF; border: 1px solid #DDD; color: #444; cursor: pointer; display: inline-block; font-size: 16px; margin: 0 0 0 -1px; padding: .5em .75em; z-index: 1; }
-.tab-navigation li:hover { background: #EEE; }
-.tab-navigation li.disabled { background: #F5F5F5; color: #999; }
-.tab-navigation li.active { background: #666; border-color: #666; color: #FAFAFA; z-index: 1100; }
-.tab-navigation li .badge { background-color: #F5F5F5; color: #777; display: inline-block; font-size: 14px; font-weight: bold; margin-left: 8px; min-width: 10px; padding: 1px 6px; text-align: center; }
-.tab-navigation li:hover .badge { background: #FAFAFA; color: #777; }
-.tab-navigation li.active .badge { background-color: #444; color: #FFF; }
-.tab-navigation li .badge.status-warning { background: #A46A1F; color: #FFF; }
-.tab-navigation li .badge.status-error { background: #B0413E; color: #FFF; }
+.tab-navigation li { background: var(--tab-background); border: 1px solid var(--table-border); color: var(--tab-color); cursor: pointer; display: inline-block; font-size: 16px; margin: 0 0 0 -1px; padding: .5em .75em; z-index: 1; }
+.tab-navigation li .badge { background-color: var(--base-1); color: var(--base-4); display: inline-block; font-size: 14px; font-weight: bold; margin-left: 8px; min-width: 10px; padding: 1px 6px; text-align: center; white-space: nowrap; }
+.tab-navigation li.disabled { background: var(--tab-disabled-background); color: var(--tab-disabled-color); }
+.tab-navigation li.active { background: var(--tab-active-background); color: var(--tab-active-color); z-index: 1100; }
+.tab-navigation li.active .badge { background-color: var(--base-5); color: var(--base-2); }
.tab-content > *:first-child { margin-top: 0; }
+.tab-navigation li .badge.status-warning { background: var(--color-warning); color: #FFF; }
+.tab-navigation li .badge.status-error { background: var(--color-error); color: #FFF; }
+.sf-tabs .tab:not(:first-child) { display: none; }
[data-filters] { position: relative; }
[data-filtered] { cursor: pointer; }
@@ -126,7 +125,7 @@ thead.sf-toggle-content.sf-toggle-visible, tbody.sf-toggle-content.sf-toggle-vis
.filter-list-level li.active { cursor: n-resize; }
.filter-list-level li.last-active { cursor: default; }
.filter-list-level li.last-active:before { content: '\2714\00a0'; }
-.filter-list-choice li:before { content: '\2714\00a0'; color: var(--tab-background); }
+.filter-list-choice li:before { content: '\2714\00a0'; color: transparent; }
.filter-list-choice li.active:before { color: unset; }
.container { max-width: 1024px; margin: 0 auto; padding: 0 15px; }
diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/form.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/form.html.twig
index 02b77319ac..720da85750 100644
--- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/form.html.twig
+++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/form.html.twig
@@ -177,6 +177,12 @@
color: inherit;
text-decoration: inherit;
}
+ h2 + h3.form-data-type {
+ margin-top: 0;
+ }
+ h3.form-data-type + h3 {
+ margin-top: 1em;
+ }
{% endblock %}
@@ -455,9 +461,10 @@
{% macro form_tree_details(name, data, forms_by_hash, show) %}
{% import _self as tree %}
-
- {{ name|default('(no name)') }} {% if data.type_class is defined %}({{ profiler_dump(data.type_class) }}){% endif %}
-
+
{{ name|default('(no name)') }}
+ {% if data.type_class is defined %}
+
+ {% endif %}
{% if data.errors is defined and data.errors|length > 0 %}
diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/profiler.css.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/profiler.css.twig
index 5f6582ed38..dd5b970148 100644
--- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/profiler.css.twig
+++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/profiler.css.twig
@@ -957,7 +957,7 @@ tr.status-warning td {
.filter-list-level li.active { cursor: n-resize; }
.filter-list-level li.last-active { cursor: default; }
.filter-list-level li.last-active:before { content: '\2714\00a0'; }
-.filter-list-choice li:before { content: '\2714\00a0'; color: var(--tab-background); }
+.filter-list-choice li:before { content: '\2714\00a0'; color: transparent; }
.filter-list-choice li.active:before { color: unset; }
{# Twig panel
diff --git a/src/Symfony/Bundle/WebProfilerBundle/composer.json b/src/Symfony/Bundle/WebProfilerBundle/composer.json
index fc8ee7cfd7..af07f8cf8c 100644
--- a/src/Symfony/Bundle/WebProfilerBundle/composer.json
+++ b/src/Symfony/Bundle/WebProfilerBundle/composer.json
@@ -32,6 +32,7 @@
"conflict": {
"symfony/dependency-injection": "<3.4",
"symfony/event-dispatcher": "<3.4",
+ "symfony/messenger": "<4.2",
"symfony/var-dumper": "<3.4"
},
"autoload": {
diff --git a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
index 204a991850..71accf4f8c 100644
--- a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
+++ b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
@@ -597,9 +597,7 @@ EOF;
if ($callable[0] instanceof Reference
|| ($callable[0] instanceof Definition && $this->definitionVariables->contains($callable[0]))
) {
- $callable[0] = $this->dumpValue($callable[0]);
-
- return sprintf(' '.('$' === $callable[0][0] ? '%s' : '(%s)')."->%s(\$%s);\n", $callable[0], $callable[1], $variableName);
+ return sprintf(" %s->%s(\$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName);
}
$class = $this->dumpValue($callable[0]);
@@ -1639,6 +1637,7 @@ EOF;
if ($definition->isShared() && !isset($this->singleUsePrivateIds[$id])) {
$code = sprintf('$this->%s[\'%s\'] = %s', $definition->isPublic() ? 'services' : 'privates', $id, $code);
}
+ $code = "($code)";
} elseif ($this->asFiles && !$this->isHotPath($definition)) {
$code = sprintf("\$this->load('%s.php')", $this->generateMethodName($id));
if (!$definition->isShared()) {
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
index 7ea36673ec..2063c25910 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
@@ -821,7 +821,7 @@ class PhpDumperTest extends TestCase
->setPublic(false);
$container->register('public_foo', 'stdClass')
->setPublic(true)
- ->addArgument(new Expression('service("private_foo")'));
+ ->addArgument(new Expression('service("private_foo").bar'));
$container->compile();
$dumper = new PhpDumper($container);
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_as_files.txt b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_as_files.txt
index 126d5fba32..6d305e570f 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_as_files.txt
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_as_files.txt
@@ -338,7 +338,7 @@ use Symfony\Component\DependencyInjection\Exception\RuntimeException;
return $this->services['tagged_iterator'] = new \Bar(new RewindableGenerator(function () {
yield 0 => ($this->services['foo'] ?? $this->load('getFooService.php'));
- yield 1 => ($this->privates['tagged_iterator_foo'] ?? $this->privates['tagged_iterator_foo'] = new \Bar());
+ yield 1 => ($this->privates['tagged_iterator_foo'] ?? ($this->privates['tagged_iterator_foo'] = new \Bar()));
}, 2));
[Container%s/getThrowingOneService.php] => services['tagged_iterator'] = new \Bar(new RewindableGenerator(function () {
yield 0 => ($this->services['foo'] ?? $this->getFooService());
- yield 1 => ($this->privates['tagged_iterator_foo'] ?? $this->privates['tagged_iterator_foo'] = new \Bar());
+ yield 1 => ($this->privates['tagged_iterator_foo'] ?? ($this->privates['tagged_iterator_foo'] = new \Bar()));
}, 2));
}
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_public.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_public.php
index 7d2970de58..1f03714232 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_public.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_public.php
@@ -103,7 +103,7 @@ class Symfony_DI_PhpDumper_Test_Almost_Circular_Public extends Container
{
$this->services['bar3'] = $instance = new \BarCircular();
- $a = ($this->services['foobar3'] ?? $this->services['foobar3'] = new \FoobarCircular());
+ $a = ($this->services['foobar3'] ?? ($this->services['foobar3'] = new \FoobarCircular()));
$instance->addFoobar($a, $a);
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_env_in_id.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_env_in_id.php
index de90f200d6..969137450a 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_env_in_id.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_env_in_id.php
@@ -59,7 +59,7 @@ class ProjectServiceContainer extends Container
*/
protected function getBarService()
{
- return $this->services['bar'] = new \stdClass(($this->privates['bar_%env(BAR)%'] ?? $this->privates['bar_%env(BAR)%'] = new \stdClass()));
+ return $this->services['bar'] = new \stdClass(($this->privates['bar_%env(BAR)%'] ?? ($this->privates['bar_%env(BAR)%'] = new \stdClass())));
}
/**
@@ -69,7 +69,7 @@ class ProjectServiceContainer extends Container
*/
protected function getFooService()
{
- return $this->services['foo'] = new \stdClass(($this->privates['bar_%env(BAR)%'] ?? $this->privates['bar_%env(BAR)%'] = new \stdClass()), array('baz_'.$this->getEnv('string:BAR') => new \stdClass()));
+ return $this->services['foo'] = new \stdClass(($this->privates['bar_%env(BAR)%'] ?? ($this->privates['bar_%env(BAR)%'] = new \stdClass())), array('baz_'.$this->getEnv('string:BAR') => new \stdClass()));
}
public function getParameter($name)
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_errored_definition.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_errored_definition.php
index 9620bb5991..22d6ebbf13 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_errored_definition.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_errored_definition.php
@@ -391,7 +391,7 @@ class Symfony_DI_PhpDumper_Errored_Definition extends Container
{
return $this->services['tagged_iterator'] = new \Bar(new RewindableGenerator(function () {
yield 0 => ($this->services['foo'] ?? $this->getFooService());
- yield 1 => ($this->privates['tagged_iterator_foo'] ?? $this->privates['tagged_iterator_foo'] = new \Bar());
+ yield 1 => ($this->privates['tagged_iterator_foo'] ?? ($this->privates['tagged_iterator_foo'] = new \Bar()));
}, 2));
}
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_locator.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_locator.php
index 4edbb3d7cd..4ea482ee22 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_locator.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_locator.php
@@ -65,7 +65,7 @@ class ProjectServiceContainer extends Container
*/
protected function getBarServiceService()
{
- return $this->services['bar_service'] = new \stdClass(($this->privates['baz_service'] ?? $this->privates['baz_service'] = new \stdClass()));
+ return $this->services['bar_service'] = new \stdClass(($this->privates['baz_service'] ?? ($this->privates['baz_service'] = new \stdClass())));
}
/**
@@ -78,7 +78,7 @@ class ProjectServiceContainer extends Container
return $this->services['foo_service'] = new \Symfony\Component\DependencyInjection\ServiceLocator(array('bar' => function () {
return ($this->services['bar_service'] ?? $this->getBarServiceService());
}, 'baz' => function (): \stdClass {
- return ($this->privates['baz_service'] ?? $this->privates['baz_service'] = new \stdClass());
+ return ($this->privates['baz_service'] ?? ($this->privates['baz_service'] = new \stdClass()));
}, 'nil' => function () {
return NULL;
}));
@@ -122,7 +122,7 @@ class ProjectServiceContainer extends Container
protected function getTranslator1Service()
{
return $this->services['translator_1'] = new \Symfony\Component\DependencyInjection\Tests\Fixtures\StubbedTranslator(new \Symfony\Component\DependencyInjection\ServiceLocator(array('translator.loader_1' => function () {
- return ($this->services['translator.loader_1'] ?? $this->services['translator.loader_1'] = new \stdClass());
+ return ($this->services['translator.loader_1'] ?? ($this->services['translator.loader_1'] = new \stdClass()));
})));
}
@@ -134,10 +134,10 @@ class ProjectServiceContainer extends Container
protected function getTranslator2Service()
{
$this->services['translator_2'] = $instance = new \Symfony\Component\DependencyInjection\Tests\Fixtures\StubbedTranslator(new \Symfony\Component\DependencyInjection\ServiceLocator(array('translator.loader_2' => function () {
- return ($this->services['translator.loader_2'] ?? $this->services['translator.loader_2'] = new \stdClass());
+ return ($this->services['translator.loader_2'] ?? ($this->services['translator.loader_2'] = new \stdClass()));
})));
- $instance->addResource('db', ($this->services['translator.loader_2'] ?? $this->services['translator.loader_2'] = new \stdClass()), 'nl');
+ $instance->addResource('db', ($this->services['translator.loader_2'] ?? ($this->services['translator.loader_2'] = new \stdClass())), 'nl');
return $instance;
}
@@ -150,10 +150,10 @@ class ProjectServiceContainer extends Container
protected function getTranslator3Service()
{
$this->services['translator_3'] = $instance = new \Symfony\Component\DependencyInjection\Tests\Fixtures\StubbedTranslator(new \Symfony\Component\DependencyInjection\ServiceLocator(array('translator.loader_3' => function () {
- return ($this->services['translator.loader_3'] ?? $this->services['translator.loader_3'] = new \stdClass());
+ return ($this->services['translator.loader_3'] ?? ($this->services['translator.loader_3'] = new \stdClass()));
})));
- $a = ($this->services['translator.loader_3'] ?? $this->services['translator.loader_3'] = new \stdClass());
+ $a = ($this->services['translator.loader_3'] ?? ($this->services['translator.loader_3'] = new \stdClass()));
$instance->addResource('db', $a, 'nl');
$instance->addResource('db', $a, 'en');
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_private_frozen.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_private_frozen.php
index 1fe2259fa8..559a3ecebf 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_private_frozen.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_private_frozen.php
@@ -56,7 +56,7 @@ class ProjectServiceContainer extends Container
*/
protected function getBarServiceService()
{
- return $this->services['bar_service'] = new \stdClass(($this->privates['baz_service'] ?? $this->privates['baz_service'] = new \stdClass()));
+ return $this->services['bar_service'] = new \stdClass(($this->privates['baz_service'] ?? ($this->privates['baz_service'] = new \stdClass())));
}
/**
@@ -66,6 +66,6 @@ class ProjectServiceContainer extends Container
*/
protected function getFooServiceService()
{
- return $this->services['foo_service'] = new \stdClass(($this->privates['baz_service'] ?? $this->privates['baz_service'] = new \stdClass()));
+ return $this->services['foo_service'] = new \stdClass(($this->privates['baz_service'] ?? ($this->privates['baz_service'] = new \stdClass())));
}
}
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_private_in_expression.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_private_in_expression.php
index 1d2a3b21b8..db3a5a2815 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_private_in_expression.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_private_in_expression.php
@@ -56,6 +56,6 @@ class ProjectServiceContainer extends Container
*/
protected function getPublicFooService()
{
- return $this->services['public_foo'] = new \stdClass(new \stdClass());
+ return $this->services['public_foo'] = new \stdClass((new \stdClass())->bar);
}
}
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_uninitialized_ref.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_uninitialized_ref.php
index 828266d6bc..f18de622b2 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_uninitialized_ref.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_uninitialized_ref.php
@@ -96,7 +96,7 @@ class Symfony_DI_PhpDumper_Test_Uninitialized_Reference extends Container
{
$this->services['baz'] = $instance = new \stdClass();
- $instance->foo3 = ($this->privates['foo3'] ?? $this->privates['foo3'] = new \stdClass());
+ $instance->foo3 = ($this->privates['foo3'] ?? ($this->privates['foo3'] = new \stdClass()));
return $instance;
}
diff --git a/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherTrait.php b/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherTrait.php
index 2a6f0b6a95..66e3918dfb 100644
--- a/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherTrait.php
+++ b/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherTrait.php
@@ -67,7 +67,7 @@ trait PhpMatcherTrait
throw new ResourceNotFoundException();
}
- private function doMatch(string $rawPathinfo, array &$allow = array(), array &$allowSchemes = array()): ?array
+ private function doMatch(string $rawPathinfo, array &$allow = array(), array &$allowSchemes = array()): array
{
$allow = $allowSchemes = array();
$pathinfo = rawurldecode($rawPathinfo) ?: '/';
@@ -91,7 +91,7 @@ trait PhpMatcherTrait
if ('/' === $pathinfo || $hasTrailingSlash === ('/' === $pathinfo[-1])) {
// no-op
} elseif ($this instanceof RedirectableUrlMatcherInterface) {
- return null;
+ return $allow = $allowSchemes = array();
} else {
continue;
}
@@ -140,7 +140,7 @@ trait PhpMatcherTrait
}
if ($hasTrailingSlash !== ('/' === $pathinfo[-1])) {
if ($this instanceof RedirectableUrlMatcherInterface && (!$requiredMethods || isset($requiredMethods['GET']))) {
- return null;
+ return $allow = $allowSchemes = array();
}
continue;
}
@@ -176,6 +176,6 @@ trait PhpMatcherTrait
throw new NoConfigurationException();
}
- return null;
+ return array();
}
}
diff --git a/src/Symfony/Component/Routing/Matcher/UrlMatcher.php b/src/Symfony/Component/Routing/Matcher/UrlMatcher.php
index 9ffce6e951..20d2fcae66 100644
--- a/src/Symfony/Component/Routing/Matcher/UrlMatcher.php
+++ b/src/Symfony/Component/Routing/Matcher/UrlMatcher.php
@@ -143,9 +143,9 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface
} elseif (!$supportsTrailingSlash || ($requiredMethods && !\in_array('GET', $requiredMethods))) {
continue;
} elseif ('/' === $staticPrefix[-1] && substr($staticPrefix, 0, -1) === $pathinfo) {
- return;
+ return $this->allow = $this->allowSchemes = array();
} elseif ('/' === $pathinfo[-1] && substr($pathinfo, 0, -1) === $staticPrefix) {
- return;
+ return $this->allow = $this->allowSchemes = array();
} else {
continue;
}
@@ -171,7 +171,7 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface
}
if ($hasTrailingSlash !== ('/' === $pathinfo[-1])) {
if (!$requiredMethods || \in_array('GET', $requiredMethods)) {
- return;
+ return $this->allow = $this->allowSchemes = array();
}
continue;
}
@@ -212,6 +212,8 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface
return $this->getAttributes($route, $name, array_replace($matches, $hostMatches, isset($status[1]) ? $status[1] : array()));
}
+
+ return array();
}
/**
diff --git a/src/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php b/src/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php
index eb1703353b..f1d6b5325d 100644
--- a/src/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php
+++ b/src/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php
@@ -170,6 +170,23 @@ class RedirectableUrlMatcherTest extends UrlMatcherTest
$matcher->match('/foo');
}
+ public function testSlashAndVerbPrecedenceWithRedirection()
+ {
+ $coll = new RouteCollection();
+ $coll->add('a', new Route('/api/customers/{customerId}/contactpersons', array(), array(), array(), '', array(), array('post')));
+ $coll->add('b', new Route('/api/customers/{customerId}/contactpersons/', array(), array(), array(), '', array(), array('get')));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $expected = array(
+ '_route' => 'b',
+ 'customerId' => '123',
+ );
+ $this->assertEquals($expected, $matcher->match('/api/customers/123/contactpersons/'));
+
+ $matcher->expects($this->once())->method('redirect')->with('/api/customers/123/contactpersons/')->willReturn(array());
+ $this->assertEquals($expected, $matcher->match('/api/customers/123/contactpersons'));
+ }
+
protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
{
return $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($routes, $context ?: new RequestContext()));
diff --git a/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php b/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php
index d808180aec..6c065050d3 100644
--- a/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php
+++ b/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php
@@ -711,6 +711,20 @@ class UrlMatcherTest extends TestCase
$this->assertSame(array('_route' => 'b'), $matcher->match('/bar/'));
}
+ public function testSlashAndVerbPrecedence()
+ {
+ $coll = new RouteCollection();
+ $coll->add('a', new Route('/api/customers/{customerId}/contactpersons/', array(), array(), array(), '', array(), array('post')));
+ $coll->add('b', new Route('/api/customers/{customerId}/contactpersons', array(), array(), array(), '', array(), array('get')));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $expected = array(
+ '_route' => 'b',
+ 'customerId' => '123',
+ );
+ $this->assertEquals($expected, $matcher->match('/api/customers/123/contactpersons'));
+ }
+
protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
{
return new UrlMatcher($routes, $context ?: new RequestContext());
diff --git a/src/Symfony/Component/Serializer/Normalizer/DateTimeNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/DateTimeNormalizer.php
index 26c48e5fd4..02ae517f25 100644
--- a/src/Symfony/Component/Serializer/Normalizer/DateTimeNormalizer.php
+++ b/src/Symfony/Component/Serializer/Normalizer/DateTimeNormalizer.php
@@ -68,7 +68,8 @@ class DateTimeNormalizer implements NormalizerInterface, DenormalizerInterface,
$timezone = $this->getTimezone($context);
if (null !== $timezone) {
- $object = (new \DateTimeImmutable('@'.$object->getTimestamp()))->setTimezone($timezone);
+ $object = clone $object;
+ $object = $object->setTimezone($timezone);
}
return $object->format($dateTimeFormat);
diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/DateTimeNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/DateTimeNormalizerTest.php
index 87edb8df4c..91b6909f17 100644
--- a/src/Symfony/Component/Serializer/Tests/Normalizer/DateTimeNormalizerTest.php
+++ b/src/Symfony/Component/Serializer/Tests/Normalizer/DateTimeNormalizerTest.php
@@ -103,6 +103,82 @@ class DateTimeNormalizerTest extends TestCase
yield array('2016-12-01T09:00:00+09:00', new \DateTimeImmutable('2016/12/01', new \DateTimeZone('UTC')), new \DateTimeZone('Japan'));
}
+ /**
+ * @dataProvider normalizeUsingTimeZonePassedInContextAndExpectedFormatWithMicrosecondsProvider
+ */
+ public function testNormalizeUsingTimeZonePassedInContextAndFormattedWithMicroseconds($expected, $expectedFormat, $input, $timezone)
+ {
+ $this->assertSame(
+ $expected,
+ $this->normalizer->normalize(
+ $input,
+ null,
+ array(
+ DateTimeNormalizer::TIMEZONE_KEY => $timezone,
+ DateTimeNormalizer::FORMAT_KEY => $expectedFormat,
+ )
+ )
+ );
+ }
+
+ public function normalizeUsingTimeZonePassedInContextAndExpectedFormatWithMicrosecondsProvider()
+ {
+ yield array(
+ '2018-12-01T18:03:06.067634',
+ 'Y-m-d\TH:i:s.u',
+ \DateTime::createFromFormat(
+ 'Y-m-d\TH:i:s.u',
+ '2018-12-01T18:03:06.067634',
+ new \DateTimeZone('UTC')
+ ),
+ null,
+ );
+
+ yield array(
+ '2018-12-01T18:03:06.067634',
+ 'Y-m-d\TH:i:s.u',
+ \DateTime::createFromFormat(
+ 'Y-m-d\TH:i:s.u',
+ '2018-12-01T18:03:06.067634',
+ new \DateTimeZone('UTC')
+ ),
+ new \DateTimeZone('UTC'),
+ );
+
+ yield array(
+ '2018-12-01T19:03:06.067634+01:00',
+ 'Y-m-d\TH:i:s.uP',
+ \DateTimeImmutable::createFromFormat(
+ 'Y-m-d\TH:i:s.u',
+ '2018-12-01T18:03:06.067634',
+ new \DateTimeZone('UTC')
+ ),
+ new \DateTimeZone('Europe/Rome'),
+ );
+
+ yield array(
+ '2018-12-01T20:03:06.067634+02:00',
+ 'Y-m-d\TH:i:s.uP',
+ \DateTime::createFromFormat(
+ 'Y-m-d\TH:i:s.u',
+ '2018-12-01T18:03:06.067634',
+ new \DateTimeZone('UTC')
+ ),
+ new \DateTimeZone('Europe/Kiev'),
+ );
+
+ yield array(
+ '2018-12-01T21:03:06.067634',
+ 'Y-m-d\TH:i:s.u',
+ \DateTime::createFromFormat(
+ 'Y-m-d\TH:i:s.u',
+ '2018-12-01T18:03:06.067634',
+ new \DateTimeZone('UTC')
+ ),
+ new \DateTimeZone('Europe/Moscow'),
+ );
+ }
+
/**
* @expectedException \Symfony\Component\Serializer\Exception\InvalidArgumentException
* @expectedExceptionMessage The object must implement the "\DateTimeInterface".
diff --git a/src/Symfony/Component/VarExporter/Internal/Exporter.php b/src/Symfony/Component/VarExporter/Internal/Exporter.php
index bbb409e194..563eadc8c4 100644
--- a/src/Symfony/Component/VarExporter/Internal/Exporter.php
+++ b/src/Symfony/Component/VarExporter/Internal/Exporter.php
@@ -125,8 +125,7 @@ class Exporter
$c = 'stdClass';
} elseif ('*' === $n[1]) {
$n = substr($n, 3);
- $c = $reflector->getProperty($n)->class;
- if ('Error' === $c) {
+ if ('Error' === $c = $class) {
$c = 'TypeError';
} elseif ('Exception' === $c) {
$c = 'ErrorException';
diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/abstract-parent.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/abstract-parent.php
new file mode 100644
index 0000000000..5548b9f8c8
--- /dev/null
+++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/abstract-parent.php
@@ -0,0 +1,17 @@
+ [
+ 'foo' => [
+ 123,
+ ],
+ ],
+ ],
+ $o[0],
+ []
+);
diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/final-error.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/final-error.php
index dc260dc024..78da251141 100644
--- a/src/Symfony/Component/VarExporter/Tests/Fixtures/final-error.php
+++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/final-error.php
@@ -6,7 +6,7 @@ return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
]),
null,
[
- 'TypeError' => [
+ 'Symfony\\Component\\VarExporter\\Tests\\FinalError' => [
'file' => [
\dirname(__DIR__).\DIRECTORY_SEPARATOR.'VarExporterTest.php',
],
diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/private.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/private.php
index a9e28416e5..a901afe6ea 100644
--- a/src/Symfony/Component/VarExporter/Tests/Fixtures/private.php
+++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/private.php
@@ -10,13 +10,17 @@ return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
'Symfony\\Component\\VarExporter\\Tests\\MyPrivateValue' => [
'prot' => [
123,
- 123,
],
'priv' => [
234,
234,
],
],
+ 'Symfony\\Component\\VarExporter\\Tests\\MyPrivateChildValue' => [
+ 'prot' => [
+ 1 => 123,
+ ],
+ ],
],
[
$o[0],
diff --git a/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php b/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php
index f509617686..c88f445b76 100644
--- a/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php
+++ b/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php
@@ -192,6 +192,8 @@ class VarExporterTest extends TestCase
$value->bis = new \ReflectionClass($value);
yield array('wakeup-refl', $value);
+
+ yield array('abstract-parent', new ConcreteClass());
}
}
@@ -320,3 +322,16 @@ final class FinalStdClass extends \stdClass
throw new \BadMethodCallException('Should not be called.');
}
}
+
+abstract class AbstractClass
+{
+ protected $foo;
+}
+
+class ConcreteClass extends AbstractClass
+{
+ public function __construct()
+ {
+ $this->foo = 123;
+ }
+}