From e0ef35973df6998427d94aed4841e495d42b2c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Wed, 19 Jun 2019 22:36:28 +0200 Subject: [PATCH 1/8] [FrameworkBundle] Use default_locale as default value for translator.fallbacks --- .../FrameworkBundle/DependencyInjection/Configuration.php | 3 ++- .../DependencyInjection/FrameworkExtension.php | 6 +++--- .../Tests/DependencyInjection/ConfigurationTest.php | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index ea64157fde..63ae42f8ba 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -763,9 +763,10 @@ class Configuration implements ConfigurationInterface ->fixXmlConfig('path') ->children() ->arrayNode('fallbacks') + ->info('Defaults to the value of "default_locale".') ->beforeNormalization()->ifString()->then(function ($v) { return [$v]; })->end() ->prototype('scalar')->end() - ->defaultValue(['en']) + ->defaultValue([]) ->end() ->booleanNode('logging')->defaultValue(false)->end() ->scalarNode('formatter')->defaultValue('translator.formatter.default')->end() diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 19386d9721..734c312e8c 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -296,7 +296,7 @@ class FrameworkExtension extends Extension $this->registerEsiConfiguration($config['esi'], $container, $loader); $this->registerSsiConfiguration($config['ssi'], $container, $loader); $this->registerFragmentsConfiguration($config['fragments'], $container, $loader); - $this->registerTranslatorConfiguration($config['translator'], $container, $loader); + $this->registerTranslatorConfiguration($config['translator'], $container, $loader, $config['default_locale']); $this->registerProfilerConfiguration($config['profiler'], $container, $loader); $this->registerCacheConfiguration($config['cache'], $container); $this->registerWorkflowConfiguration($config['workflows'], $container, $loader); @@ -1073,7 +1073,7 @@ class FrameworkExtension extends Extension return new Reference('assets.empty_version_strategy'); } - private function registerTranslatorConfiguration(array $config, ContainerBuilder $container, LoaderInterface $loader) + private function registerTranslatorConfiguration(array $config, ContainerBuilder $container, LoaderInterface $loader, string $defaultLocale) { if (!$this->isConfigEnabled($container, $config)) { $container->removeDefinition('console.command.translation_debug'); @@ -1088,7 +1088,7 @@ class FrameworkExtension extends Extension $container->setAlias('translator', 'translator.default')->setPublic(true); $container->setAlias('translator.formatter', new Alias($config['formatter'], false)); $translator = $container->findDefinition('translator.default'); - $translator->addMethodCall('setFallbackLocales', [$config['fallbacks']]); + $translator->addMethodCall('setFallbackLocales', [$config['fallbacks'] ?: [$defaultLocale]]); $container->setParameter('translator.logging', $config['logging']); $container->setParameter('translator.default_path', $config['default_path']); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php index 3980036006..8ddd17ccad 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php @@ -245,7 +245,7 @@ class ConfigurationTest extends TestCase ], 'translator' => [ 'enabled' => !class_exists(FullStack::class), - 'fallbacks' => ['en'], + 'fallbacks' => [], 'logging' => false, 'formatter' => 'translator.formatter.default', 'paths' => [], From 29ba091898a41eced4bdac099c4ec12ab6f3597a Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sat, 29 Jun 2019 23:05:23 +0200 Subject: [PATCH 2/8] [FrameworkBundle] Allow creating chained cache pools by providing several adapters --- .../Bundle/FrameworkBundle/CHANGELOG.md | 1 + .../DependencyInjection/Configuration.php | 32 ++++++++++++- .../FrameworkExtension.php | 24 ++++++++-- .../Resources/config/schema/symfony-1.0.xsd | 9 ++++ .../Fixtures/php/cache.php | 8 ++++ .../Fixtures/xml/cache.xml | 5 ++ .../Fixtures/yml/cache.yml | 6 +++ .../FrameworkExtensionTest.php | 27 ++++++++++- .../Bundle/FrameworkBundle/composer.json | 2 +- .../DependencyInjection/CachePoolPass.php | 48 ++++++++++++++++++- 10 files changed, 152 insertions(+), 10 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md index 2bad905c72..9abe75f181 100644 --- a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md +++ b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md @@ -8,6 +8,7 @@ CHANGELOG * Deprecated the `$parser` argument of `ControllerResolver::__construct()` and `DelegatingLoader::__construct()` * Deprecated the `controller_name_converter` and `resolve_controller_name_subscriber` services * The `ControllerResolver` and `DelegatingLoader` classes have been marked as `final` + * Added support for configuring chained cache pools 4.3.0 ----- diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index cb704c126a..eb2f620e92 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -978,8 +978,38 @@ class Configuration implements ConfigurationInterface ->arrayNode('pools') ->useAttributeAsKey('name') ->prototype('array') + ->fixXmlConfig('adapter') + ->beforeNormalization() + ->ifTrue(function ($v) { return (isset($v['adapters']) || \is_array($v['adapter'] ?? null)) && isset($v['provider']); }) + ->thenInvalid('Pool cannot have a "provider" while "adapter" is set to a map') + ->end() ->children() - ->scalarNode('adapter')->defaultValue('cache.app')->end() + ->arrayNode('adapters') + ->info('One or more adapters to chain for creating the pool, defaults to "cache.app".') + ->beforeNormalization() + ->always()->then(function ($values) { + if ([0] === array_keys($values) && \is_array($values[0])) { + return $values[0]; + } + $adapters = []; + + foreach ($values as $k => $v) { + if (\is_int($k) && \is_string($v)) { + $adapters[] = $v; + } elseif (!\is_array($v)) { + $adapters[$k] = $v; + } elseif (isset($v['provider'])) { + $adapters[$v['provider']] = $v['name'] ?? $v; + } else { + $adapters[] = $v['name'] ?? $v; + } + } + + return $adapters; + }) + ->end() + ->prototype('scalar')->end() + ->end() ->scalarNode('tags')->defaultNull()->end() ->booleanNode('public')->defaultFalse()->end() ->integerNode('default_lifetime')->end() diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 5721f49262..329e39e0d0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -29,6 +29,7 @@ use Symfony\Component\BrowserKit\AbstractBrowser; use Symfony\Component\Cache\Adapter\AbstractAdapter; use Symfony\Component\Cache\Adapter\AdapterInterface; use Symfony\Component\Cache\Adapter\ArrayAdapter; +use Symfony\Component\Cache\Adapter\ChainAdapter; use Symfony\Component\Cache\Adapter\TagAwareAdapter; use Symfony\Component\Cache\DependencyInjection\CachePoolPass; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; @@ -1809,16 +1810,29 @@ class FrameworkExtension extends Extension } foreach (['app', 'system'] as $name) { $config['pools']['cache.'.$name] = [ - 'adapter' => $config[$name], + 'adapters' => [$config[$name]], 'public' => true, 'tags' => false, ]; } foreach ($config['pools'] as $name => $pool) { - if ($config['pools'][$pool['adapter']]['tags'] ?? false) { - $pool['adapter'] = '.'.$pool['adapter'].'.inner'; + $pool['adapters'] = $pool['adapters'] ?: ['cache.app']; + + foreach ($pool['adapters'] as $provider => $adapter) { + if ($config['pools'][$adapter]['tags'] ?? false) { + $pool['adapters'][$provider] = $adapter = '.'.$adapter.'.inner'; + } + } + + if (1 === \count($pool['adapters'])) { + if (!isset($pool['provider']) && !\is_int($provider)) { + $pool['provider'] = $provider; + } + $definition = new ChildDefinition($adapter); + } else { + $definition = new Definition(ChainAdapter::class, [$pool['adapters'], 0]); + $pool['reset'] = 'reset'; } - $definition = new ChildDefinition($pool['adapter']); if ($pool['tags']) { if (true !== $pool['tags'] && ($config['pools'][$pool['tags']]['tags'] ?? false)) { @@ -1849,7 +1863,7 @@ class FrameworkExtension extends Extension } $definition->setPublic($pool['public']); - unset($pool['adapter'], $pool['public'], $pool['tags']); + unset($pool['adapters'], $pool['public'], $pool['tags']); $definition->addTag('cache.pool', $pool); $container->setDefinition($name, $definition); diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd index 04157511dc..c11b3462c2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd @@ -269,6 +269,10 @@ + + + + @@ -278,6 +282,11 @@ + + + + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache.php index 2a85f849fa..8d92edf766 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache.php @@ -24,6 +24,14 @@ $container->loadFromExtension('framework', [ 'cache.def' => [ 'default_lifetime' => 11, ], + 'cache.chain' => [ + 'default_lifetime' => 12, + 'adapter' => [ + 'cache.adapter.array', + 'cache.adapter.filesystem', + 'redis://foo' => 'cache.adapter.redis', + ], + ], ], ], ]); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache.xml index 0ebf2a960a..2db74964b5 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache.xml @@ -12,6 +12,11 @@ + + + + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache.yml index 514e782e6e..ee20bc74b2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache.yml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache.yml @@ -17,3 +17,9 @@ framework: provider: app.cache_pool cache.def: default_lifetime: 11 + cache.chain: + default_lifetime: 12 + adapter: + - cache.adapter.array + - cache.adapter.filesystem + - {name: cache.adapter.redis, provider: 'redis://foo'} diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index e99f37d9d6..264551153d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -20,10 +20,12 @@ use Symfony\Bundle\FullStack; use Symfony\Component\Cache\Adapter\AdapterInterface; use Symfony\Component\Cache\Adapter\ApcuAdapter; use Symfony\Component\Cache\Adapter\ArrayAdapter; +use Symfony\Component\Cache\Adapter\ChainAdapter; use Symfony\Component\Cache\Adapter\DoctrineAdapter; use Symfony\Component\Cache\Adapter\FilesystemAdapter; use Symfony\Component\Cache\Adapter\ProxyAdapter; use Symfony\Component\Cache\Adapter\RedisAdapter; +use Symfony\Component\Cache\DependencyInjection\CachePoolPass; use Symfony\Component\Config\Resource\DirectoryResource; use Symfony\Component\Config\Resource\FileExistenceResource; use Symfony\Component\DependencyInjection\ChildDefinition; @@ -1423,13 +1425,36 @@ abstract class FrameworkExtensionTest extends TestCase public function testCachePoolServices() { - $container = $this->createContainerFromFile('cache'); + $container = $this->createContainerFromFile('cache', [], true, false); + $container->setParameter('cache.prefix.seed', 'test'); + $container->addCompilerPass(new CachePoolPass()); + $container->compile(); $this->assertCachePoolServiceDefinitionIsCreated($container, 'cache.foo', 'cache.adapter.apcu', 30); $this->assertCachePoolServiceDefinitionIsCreated($container, 'cache.bar', 'cache.adapter.doctrine', 5); $this->assertCachePoolServiceDefinitionIsCreated($container, 'cache.baz', 'cache.adapter.filesystem', 7); $this->assertCachePoolServiceDefinitionIsCreated($container, 'cache.foobar', 'cache.adapter.psr6', 10); $this->assertCachePoolServiceDefinitionIsCreated($container, 'cache.def', 'cache.app', 11); + + $chain = $container->getDefinition('cache.chain'); + + $this->assertSame(ChainAdapter::class, $chain->getClass()); + + $expected = [ + [ + (new ChildDefinition('cache.adapter.array')) + ->replaceArgument(0, 12), + (new ChildDefinition('cache.adapter.filesystem')) + ->replaceArgument(0, 'x5nX4TVTWn') + ->replaceArgument(1, 12), + (new ChildDefinition('cache.adapter.redis')) + ->replaceArgument(0, new Reference('.cache_connection.kYdiLgf')) + ->replaceArgument(1, 'x5nX4TVTWn') + ->replaceArgument(2, 12), + ], + 12, + ]; + $this->assertEquals($expected, $chain->getArguments()); } public function testRemovesResourceCheckerConfigCacheFactoryArgumentOnlyIfNoDebug() diff --git a/src/Symfony/Bundle/FrameworkBundle/composer.json b/src/Symfony/Bundle/FrameworkBundle/composer.json index 2a06127e37..242d05ab62 100644 --- a/src/Symfony/Bundle/FrameworkBundle/composer.json +++ b/src/Symfony/Bundle/FrameworkBundle/composer.json @@ -18,7 +18,7 @@ "require": { "php": "^7.1.3", "ext-xml": "*", - "symfony/cache": "^4.3|^5.0", + "symfony/cache": "^4.4|^5.0", "symfony/config": "^4.2|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/error-catcher": "^4.4|^5.0", diff --git a/src/Symfony/Component/Cache/DependencyInjection/CachePoolPass.php b/src/Symfony/Component/Cache/DependencyInjection/CachePoolPass.php index 5d7a2369c2..111c556445 100644 --- a/src/Symfony/Component/Cache/DependencyInjection/CachePoolPass.php +++ b/src/Symfony/Component/Cache/DependencyInjection/CachePoolPass.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Cache\DependencyInjection; use Symfony\Component\Cache\Adapter\AbstractAdapter; use Symfony\Component\Cache\Adapter\ArrayAdapter; +use Symfony\Component\Cache\Adapter\ChainAdapter; use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -97,7 +98,50 @@ class CachePoolPass implements CompilerPassInterface if (isset($tags[0]['provider'])) { $tags[0]['provider'] = new Reference(static::getServiceProvider($container, $tags[0]['provider'])); } - $i = 0; + + if (ChainAdapter::class === $class) { + $adapters = []; + foreach ($adapter->getArgument(0) as $provider => $adapter) { + $chainedPool = $adapter = new ChildDefinition($adapter); + $chainedTags = [\is_int($provider) ? [] : ['provider' => $provider]]; + $chainedClass = ''; + + while ($adapter instanceof ChildDefinition) { + $adapter = $container->findDefinition($adapter->getParent()); + $chainedClass = $chainedClass ?: $adapter->getClass(); + if ($t = $adapter->getTag($this->cachePoolTag)) { + $chainedTags[0] += $t[0]; + } + } + + if (ChainAdapter::class === $chainedClass) { + throw new InvalidArgumentException(sprintf('Invalid service "%s": chain of adapters cannot reference another chain, found "%s".', $id, $chainedPool->getParent())); + } + + $i = 0; + + if (isset($chainedTags[0]['provider'])) { + $chainedPool->replaceArgument($i++, new Reference(static::getServiceProvider($container, $chainedTags[0]['provider']))); + } + + if (isset($tags[0]['namespace']) && ArrayAdapter::class !== $adapter->getClass()) { + $chainedPool->replaceArgument($i++, $tags[0]['namespace']); + } + + if (isset($tags[0]['default_lifetime'])) { + $chainedPool->replaceArgument($i++, $tags[0]['default_lifetime']); + } + + $adapters[] = $chainedPool; + } + + $pool->replaceArgument(0, $adapters); + unset($tags[0]['provider'], $tags[0]['namespace']); + $i = 1; + } else { + $i = 0; + } + foreach ($attributes as $attr) { if (!isset($tags[0][$attr])) { // no-op @@ -105,7 +149,7 @@ class CachePoolPass implements CompilerPassInterface if ($tags[0][$attr]) { $pool->addTag($this->kernelResetTag, ['method' => $tags[0][$attr]]); } - } elseif ('namespace' !== $attr || ArrayAdapter::class !== $adapter->getClass()) { + } elseif ('namespace' !== $attr || ArrayAdapter::class !== $class) { $pool->replaceArgument($i++, $tags[0][$attr]); } unset($tags[0][$attr]); From 9931b3e1833c2502c03f2f345bae7eae875c06da Mon Sep 17 00:00:00 2001 From: Tobias Schultze Date: Thu, 4 Jul 2019 22:24:44 +0200 Subject: [PATCH 3/8] [Messenger] fix broken key normalization --- .../FrameworkBundle/DependencyInjection/Configuration.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index b407513bef..f723a64439 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -1114,6 +1114,7 @@ class Configuration implements ConfigurationInterface ->end() ->children() ->arrayNode('routing') + ->normalizeKeys(false) ->useAttributeAsKey('message_class') ->beforeNormalization() ->always() @@ -1173,6 +1174,7 @@ class Configuration implements ConfigurationInterface ->end() ->end() ->arrayNode('transports') + ->normalizeKeys(false) ->useAttributeAsKey('name') ->arrayPrototype() ->beforeNormalization() @@ -1220,6 +1222,7 @@ class Configuration implements ConfigurationInterface ->scalarNode('default_bus')->defaultNull()->end() ->arrayNode('buses') ->defaultValue(['messenger.bus.default' => ['default_middleware' => true, 'middleware' => []]]) + ->normalizeKeys(false) ->useAttributeAsKey('name') ->arrayPrototype() ->addDefaultsIfNotSet() From 1413bdcab81cbca73d73eab93beea6410643c9c2 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 4 Jul 2019 16:26:22 +0200 Subject: [PATCH 4/8] [ErrorCatcher] Fixed some escaping in XML errors --- .../ErrorCatcher/ErrorRenderer/HtmlErrorRenderer.php | 11 ++++++++--- .../ErrorCatcher/ErrorRenderer/XmlErrorRenderer.php | 9 ++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/ErrorCatcher/ErrorRenderer/HtmlErrorRenderer.php b/src/Symfony/Component/ErrorCatcher/ErrorRenderer/HtmlErrorRenderer.php index d73fc48b4a..831f313be2 100644 --- a/src/Symfony/Component/ErrorCatcher/ErrorRenderer/HtmlErrorRenderer.php +++ b/src/Symfony/Component/ErrorCatcher/ErrorRenderer/HtmlErrorRenderer.php @@ -55,14 +55,16 @@ class HtmlErrorRenderer implements ErrorRendererInterface { $css = $this->getStylesheet(); $body = $this->getBody($exception); + $charset = $this->escapeHtml($this->charset); + $title = $this->escapeHtml($exception->getTitle()); return << - + - {$exception->getTitle()} + {$title} @@ -94,11 +96,14 @@ EOF; */ public function getBody(FlattenException $exception) { + $statusCode = $this->escapeHtml($exception->getStatusCode()); + $title = $this->escapeHtml($exception->getTitle()); + if (!$this->debug) { return <<

Oops! An Error Occurred

-

The server returned a "{$exception->getStatusCode()} {$exception->getTitle()}".

+

The server returned a "{$statusCode} {$title}".

Something is broken. Please let us know what you were doing when this error occurred. We will fix it as soon as possible. Sorry for any inconvenience caused. diff --git a/src/Symfony/Component/ErrorCatcher/ErrorRenderer/XmlErrorRenderer.php b/src/Symfony/Component/ErrorCatcher/ErrorRenderer/XmlErrorRenderer.php index 158165230f..c64df7e17e 100644 --- a/src/Symfony/Component/ErrorCatcher/ErrorRenderer/XmlErrorRenderer.php +++ b/src/Symfony/Component/ErrorCatcher/ErrorRenderer/XmlErrorRenderer.php @@ -40,7 +40,10 @@ class XmlErrorRenderer implements ErrorRendererInterface */ public function render(FlattenException $exception): string { + $title = $this->escapeXml($exception->getTitle()); $message = $this->escapeXml($exception->getMessage()); + $statusCode = $this->escapeXml($exception->getStatusCode()); + $charset = $this->escapeXml($this->charset); $exceptions = ''; if ($this->debug) { @@ -63,10 +66,10 @@ class XmlErrorRenderer implements ErrorRendererInterface } return << + - {$exception->getTitle()} - {$exception->getStatusCode()} + {$title} + {$statusCode} {$message} {$exceptions} From 4acddef91b6473487e8f4121a4f4bf7d3e3d7ca1 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 5 Jul 2019 06:51:06 +0200 Subject: [PATCH 5/8] fixed phpdocs --- .../Bundle/FrameworkBundle/Command/AbstractConfigCommand.php | 3 +++ src/Symfony/Component/Config/Definition/ArrayNode.php | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php index cc1b858abb..fe0d60b555 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php @@ -52,6 +52,9 @@ abstract class AbstractConfigCommand extends ContainerDebugCommand } } + /** + * @return ExtensionInterface + */ protected function findExtension($name) { $bundles = $this->initializeBundles(); diff --git a/src/Symfony/Component/Config/Definition/ArrayNode.php b/src/Symfony/Component/Config/Definition/ArrayNode.php index ac310819d4..2afa629cda 100644 --- a/src/Symfony/Component/Config/Definition/ArrayNode.php +++ b/src/Symfony/Component/Config/Definition/ArrayNode.php @@ -141,7 +141,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface } /** - * Whether extra keys should just be ignore without an exception. + * Whether extra keys should just be ignored without an exception. * * @param bool $boolean To allow extra keys * @param bool $remove To remove extra keys From 77747a94729b74b2353f5c0c9467662ed88f0cdb Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 5 Jul 2019 06:51:06 +0200 Subject: [PATCH 6/8] fixed phpdocs --- .../Bundle/FrameworkBundle/Command/AbstractConfigCommand.php | 3 +++ src/Symfony/Component/Config/Definition/ArrayNode.php | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php index cc1b858abb..fe0d60b555 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php @@ -52,6 +52,9 @@ abstract class AbstractConfigCommand extends ContainerDebugCommand } } + /** + * @return ExtensionInterface + */ protected function findExtension($name) { $bundles = $this->initializeBundles(); diff --git a/src/Symfony/Component/Config/Definition/ArrayNode.php b/src/Symfony/Component/Config/Definition/ArrayNode.php index ac310819d4..2afa629cda 100644 --- a/src/Symfony/Component/Config/Definition/ArrayNode.php +++ b/src/Symfony/Component/Config/Definition/ArrayNode.php @@ -141,7 +141,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface } /** - * Whether extra keys should just be ignore without an exception. + * Whether extra keys should just be ignored without an exception. * * @param bool $boolean To allow extra keys * @param bool $remove To remove extra keys From a71ee27180f6a86e13eaa3eb9491312bd8c441bb Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 5 Jul 2019 07:23:38 +0200 Subject: [PATCH 7/8] fixed UPGRADE --- UPGRADE-5.0.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/UPGRADE-5.0.md b/UPGRADE-5.0.md index b6117e1304..ebc3a54f42 100644 --- a/UPGRADE-5.0.md +++ b/UPGRADE-5.0.md @@ -334,6 +334,13 @@ Process $process = Process::fromShellCommandline('ls -l'); ``` +PropertyAccess +-------------- + + * Removed support of passing `null` as 2nd argument of + `PropertyAccessor::createCache()` method (`$defaultLifetime`), pass `0` + instead. + Routing ------- From d9833ace32c69681a0a01f309f5f2b6cc57b0485 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Fri, 5 Jul 2019 08:33:15 +0200 Subject: [PATCH 8/8] [PhpUnitBridge] fix running simple-phpunit on Windows --- src/Symfony/Bridge/PhpUnit/bin/simple-phpunit | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/PhpUnit/bin/simple-phpunit b/src/Symfony/Bridge/PhpUnit/bin/simple-phpunit index 49b88ed969..7afcbeedc7 100755 --- a/src/Symfony/Bridge/PhpUnit/bin/simple-phpunit +++ b/src/Symfony/Bridge/PhpUnit/bin/simple-phpunit @@ -94,8 +94,9 @@ if (!file_exists("$PHPUNIT_DIR/phpunit-$PHPUNIT_VERSION/phpunit") || md5_file(__ } $prevRoot = getenv('COMPOSER_ROOT_VERSION'); putenv("COMPOSER_ROOT_VERSION=$PHPUNIT_VERSION.99"); + $q = '\\' === DIRECTORY_SEPARATOR ? '"' : ''; // --no-suggest is not in the list to keep compat with composer 1.0, which is shipped with Ubuntu 16.04LTS - $exit = proc_close(proc_open("$COMPOSER install --no-dev --prefer-dist --no-progress --ansi", array(), $p, getcwd())); + $exit = proc_close(proc_open("$q$COMPOSER install --no-dev --prefer-dist --no-progress --ansi$q", array(), $p, getcwd())); putenv('COMPOSER_ROOT_VERSION'.(false !== $prevRoot ? '='.$prevRoot : '')); if ($exit) { exit($exit);