diff --git a/src/Symfony/Bridge/PhpUnit/Legacy/CoverageListenerTrait.php b/src/Symfony/Bridge/PhpUnit/Legacy/CoverageListenerTrait.php index d68aa28882..52d28cfbf8 100644 --- a/src/Symfony/Bridge/PhpUnit/Legacy/CoverageListenerTrait.php +++ b/src/Symfony/Bridge/PhpUnit/Legacy/CoverageListenerTrait.php @@ -76,7 +76,7 @@ class CoverageListenerTrait $cache = $r->getValue(); $cache = array_replace_recursive($cache, array( \get_class($test) => array( - 'covers' => array($sutFqcn), + 'covers' => \is_array($sutFqcn) ? $sutFqcn : array($sutFqcn), ), )); $r->setValue($testClass, $cache); diff --git a/src/Symfony/Bundle/FrameworkBundle/Routing/Router.php b/src/Symfony/Bundle/FrameworkBundle/Routing/Router.php index 3ac249ad50..e8ee66f1ce 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Routing/Router.php +++ b/src/Symfony/Bundle/FrameworkBundle/Routing/Router.php @@ -160,7 +160,7 @@ class Router extends BaseRouter implements WarmableInterface, ServiceSubscriberI return '%%'; } - if (preg_match('/^env\(\w+\)$/', $match[1])) { + if (preg_match('/^env\((?:\w++:)*+\w++\)$/', $match[1])) { throw new RuntimeException(sprintf('Using "%%%s%%" is not allowed in routing configuration.', $match[1])); } @@ -173,7 +173,7 @@ class Router extends BaseRouter implements WarmableInterface, ServiceSubscriberI if (\is_string($resolved) || is_numeric($resolved)) { $this->collectedParameters[$match[1]] = $resolved; - return (string) $resolved; + return (string) $this->resolve($resolved); } throw new RuntimeException(sprintf('The container parameter "%s", used in the route configuration value "%s", must be a string or numeric, but it is of type %s.', $match[1], $value, \gettype($resolved))); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Routing/RouterTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Routing/RouterTest.php index d31f69cb58..fe2f66fe9c 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Routing/RouterTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Routing/RouterTest.php @@ -16,6 +16,7 @@ use Psr\Container\ContainerInterface; use Symfony\Bundle\FrameworkBundle\Routing\Router; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\DependencyInjection\Config\ContainerParametersResource; +use Symfony\Component\DependencyInjection\Exception\RuntimeException; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; @@ -278,13 +279,13 @@ class RouterTest extends TestCase $routes->add('foo', new Route('/before/%parameter.foo%/after/%%escaped%%')); $sc = $this->getServiceContainer($routes); - $sc->setParameter('parameter.foo', 'foo'); + $sc->setParameter('parameter.foo', 'foo-%%escaped%%'); $router = new Router($sc, 'foo'); $route = $router->getRouteCollection()->get('foo'); $this->assertEquals( - '/before/foo/after/%escaped%', + '/before/foo-%escaped%/after/%escaped%', $route->getPath() ); } @@ -313,6 +314,22 @@ class RouterTest extends TestCase $router->getRouteCollection(); } + public function testIndirectEnvPlaceholders() + { + $routes = new RouteCollection(); + + $routes->add('foo', new Route('/%foo%')); + + $router = new Router($container = $this->getServiceContainer($routes), 'foo'); + $container->setParameter('foo', 'foo-%bar%'); + $container->setParameter('bar', '%env(string:FOO)%'); + + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('Using "%env(string:FOO)%" is not allowed in routing configuration.'); + + $router->getRouteCollection(); + } + public function testHostPlaceholders() { $routes = new RouteCollection(); diff --git a/src/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php b/src/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php index 0628d85186..f0f0d71f29 100644 --- a/src/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php +++ b/src/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php @@ -61,14 +61,14 @@ class GenericEventTest extends TestCase public function testSetArguments() { $result = $this->event->setArguments(['foo' => 'bar']); - $this->assertAttributeSame(['foo' => 'bar'], 'arguments', $this->event); + $this->assertSame(['foo' => 'bar'], $this->event->getArguments()); $this->assertSame($this->event, $result); } public function testSetArgument() { $result = $this->event->setArgument('foo2', 'bar2'); - $this->assertAttributeSame(['name' => 'Event', 'foo2' => 'bar2'], 'arguments', $this->event); + $this->assertSame(['name' => 'Event', 'foo2' => 'bar2'], $this->event->getArguments()); $this->assertEquals($this->event, $result); } @@ -97,13 +97,13 @@ class GenericEventTest extends TestCase public function testOffsetSet() { $this->event['foo2'] = 'bar2'; - $this->assertAttributeSame(['name' => 'Event', 'foo2' => 'bar2'], 'arguments', $this->event); + $this->assertSame(['name' => 'Event', 'foo2' => 'bar2'], $this->event->getArguments()); } public function testOffsetUnset() { unset($this->event['name']); - $this->assertAttributeSame([], 'arguments', $this->event); + $this->assertSame([], $this->event->getArguments()); } public function testOffsetIsset() diff --git a/src/Symfony/Component/HttpFoundation/Request.php b/src/Symfony/Component/HttpFoundation/Request.php index 27d5f43b67..fd8e11948d 100644 --- a/src/Symfony/Component/HttpFoundation/Request.php +++ b/src/Symfony/Component/HttpFoundation/Request.php @@ -792,7 +792,11 @@ class Request * being the original client, and each successive proxy that passed the request * adding the IP address where it received the request from. * - * @return string|null The client IP address + * If your reverse proxy uses a different header name than "X-Forwarded-For", + * ("Client-Ip" for instance), configure it via the $trustedHeaderSet + * argument of the Request::setTrustedProxies() method instead. + * + * @return string The client IP address * * @see getClientIps() * @see http://en.wikipedia.org/wiki/X-Forwarded-For diff --git a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php index a295dfb8a1..6d1b65044c 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php @@ -317,15 +317,15 @@ class PdoSessionHandlerTest extends TestCase public function testUrlDsn($url, $expectedDsn, $expectedUser = null, $expectedPassword = null) { $storage = new PdoSessionHandler($url); + $reflection = new \ReflectionClass(PdoSessionHandler::class); - $this->assertAttributeEquals($expectedDsn, 'dsn', $storage); - - if (null !== $expectedUser) { - $this->assertAttributeEquals($expectedUser, 'username', $storage); - } - - if (null !== $expectedPassword) { - $this->assertAttributeEquals($expectedPassword, 'password', $storage); + foreach (['dsn' => $expectedDsn, 'username' => $expectedUser, 'password' => $expectedPassword] as $property => $expectedValue) { + if (!isset($expectedValue)) { + continue; + } + $property = $reflection->getProperty($property); + $property->setAccessible(true); + $this->assertSame($expectedValue, $property->getValue($storage)); } } diff --git a/src/Symfony/Component/Intl/Data/Generator/LanguageDataGenerator.php b/src/Symfony/Component/Intl/Data/Generator/LanguageDataGenerator.php index 55815145da..f87a58bd1c 100644 --- a/src/Symfony/Component/Intl/Data/Generator/LanguageDataGenerator.php +++ b/src/Symfony/Component/Intl/Data/Generator/LanguageDataGenerator.php @@ -204,6 +204,8 @@ class LanguageDataGenerator extends AbstractDataGenerator } } + asort($alpha2ToAlpha3); + return $alpha2ToAlpha3; } } diff --git a/src/Symfony/Component/Intl/Resources/data/languages/meta.json b/src/Symfony/Component/Intl/Resources/data/languages/meta.json index 8b2308aea9..92eb9ba19f 100644 --- a/src/Symfony/Component/Intl/Resources/data/languages/meta.json +++ b/src/Symfony/Component/Intl/Resources/data/languages/meta.json @@ -623,14 +623,11 @@ "Alpha2ToAlpha3": { "aa": "aar", "ab": "abk", - "dz": "dzo", "af": "afr", "ak": "aka", - "sq": "sqi", "am": "amh", "ar": "ara", "an": "arg", - "hy": "hye", "as": "asm", "av": "ava", "ae": "ave", @@ -638,7 +635,6 @@ "az": "aze", "ba": "bak", "bm": "bam", - "eu": "eus", "be": "bel", "bn": "ben", "bi": "bis", @@ -646,12 +642,10 @@ "bs": "bos", "br": "bre", "bg": "bul", - "my": "mya", "ca": "cat", "cs": "ces", "ch": "cha", "ce": "che", - "zh": "zho", "cu": "chu", "cv": "chv", "kw": "cor", @@ -661,13 +655,12 @@ "da": "dan", "de": "deu", "dv": "div", - "mn": "mon", - "nl": "nld", - "et": "est", + "dz": "dzo", "el": "ell", "en": "eng", "eo": "epo", - "ik": "ipk", + "et": "est", + "eu": "eus", "ee": "ewe", "fo": "fao", "fa": "fas", @@ -676,8 +669,6 @@ "fr": "fra", "fy": "fry", "ff": "ful", - "om": "orm", - "ka": "kat", "gd": "gla", "ga": "gle", "gl": "glg", @@ -692,31 +683,34 @@ "ho": "hmo", "hr": "hrv", "hu": "hun", + "hy": "hye", "ig": "ibo", - "is": "isl", "io": "ido", "ii": "iii", "iu": "iku", "ie": "ile", "ia": "ina", "id": "ind", + "ik": "ipk", + "is": "isl", "it": "ita", "jv": "jav", "ja": "jpn", "kl": "kal", "kn": "kan", "ks": "kas", + "ka": "kat", "kr": "kau", "kk": "kaz", "km": "khm", "ki": "kik", "rw": "kin", "ky": "kir", - "ku": "kur", - "kg": "kon", "kv": "kom", + "kg": "kon", "ko": "kor", "kj": "kua", + "ku": "kur", "lo": "lao", "la": "lat", "lv": "lav", @@ -726,40 +720,43 @@ "lb": "ltz", "lu": "lub", "lg": "lug", - "mk": "mkd", "mh": "mah", "ml": "mal", - "mi": "mri", "mr": "mar", - "ms": "msa", + "mk": "mkd", "mg": "mlg", "mt": "mlt", - "ro": "ron", + "mn": "mon", + "mi": "mri", + "ms": "msa", + "my": "mya", "na": "nau", "nv": "nav", "nr": "nbl", "nd": "nde", "ng": "ndo", "ne": "nep", + "nl": "nld", "nn": "nno", "nb": "nob", "ny": "nya", "oc": "oci", "oj": "oji", "or": "ori", + "om": "orm", "os": "oss", "pa": "pan", - "ps": "pus", "pi": "pli", "pl": "pol", "pt": "por", + "ps": "pus", "qu": "que", "rm": "roh", + "ro": "ron", "rn": "run", "ru": "rus", "sg": "sag", "sa": "san", - "sr": "srp", "si": "sin", "sk": "slk", "sl": "slv", @@ -770,7 +767,9 @@ "so": "som", "st": "sot", "es": "spa", + "sq": "sqi", "sc": "srd", + "sr": "srp", "ss": "ssw", "su": "sun", "sw": "swa", @@ -800,6 +799,7 @@ "yi": "yid", "yo": "yor", "za": "zha", + "zh": "zho", "zu": "zul" } } diff --git a/src/Symfony/Component/Intl/Tests/Data/Provider/AbstractLanguageDataProviderTest.php b/src/Symfony/Component/Intl/Tests/Data/Provider/AbstractLanguageDataProviderTest.php index 50ccf78fd2..e2a24288b5 100644 --- a/src/Symfony/Component/Intl/Tests/Data/Provider/AbstractLanguageDataProviderTest.php +++ b/src/Symfony/Component/Intl/Tests/Data/Provider/AbstractLanguageDataProviderTest.php @@ -648,11 +648,9 @@ abstract class AbstractLanguageDataProviderTest extends AbstractDataProviderTest 'ab' => 'abk', 'af' => 'afr', 'ak' => 'aka', - 'sq' => 'sqi', 'am' => 'amh', 'ar' => 'ara', 'an' => 'arg', - 'hy' => 'hye', 'as' => 'asm', 'av' => 'ava', 'ae' => 'ave', @@ -660,7 +658,6 @@ abstract class AbstractLanguageDataProviderTest extends AbstractDataProviderTest 'az' => 'aze', 'ba' => 'bak', 'bm' => 'bam', - 'eu' => 'eus', 'be' => 'bel', 'bn' => 'ben', 'bi' => 'bis', @@ -668,12 +665,10 @@ abstract class AbstractLanguageDataProviderTest extends AbstractDataProviderTest 'bs' => 'bos', 'br' => 'bre', 'bg' => 'bul', - 'my' => 'mya', 'ca' => 'cat', 'cs' => 'ces', 'ch' => 'cha', 'ce' => 'che', - 'zh' => 'zho', 'cu' => 'chu', 'cv' => 'chv', 'kw' => 'cor', @@ -683,13 +678,12 @@ abstract class AbstractLanguageDataProviderTest extends AbstractDataProviderTest 'da' => 'dan', 'de' => 'deu', 'dv' => 'div', - 'nl' => 'nld', 'dz' => 'dzo', - 'et' => 'est', 'el' => 'ell', 'en' => 'eng', 'eo' => 'epo', - 'ik' => 'ipk', + 'et' => 'est', + 'eu' => 'eus', 'ee' => 'ewe', 'fo' => 'fao', 'fa' => 'fas', @@ -698,8 +692,6 @@ abstract class AbstractLanguageDataProviderTest extends AbstractDataProviderTest 'fr' => 'fra', 'fy' => 'fry', 'ff' => 'ful', - 'om' => 'orm', - 'ka' => 'kat', 'gd' => 'gla', 'ga' => 'gle', 'gl' => 'glg', @@ -714,32 +706,34 @@ abstract class AbstractLanguageDataProviderTest extends AbstractDataProviderTest 'ho' => 'hmo', 'hr' => 'hrv', 'hu' => 'hun', + 'hy' => 'hye', 'ig' => 'ibo', - 'is' => 'isl', 'io' => 'ido', 'ii' => 'iii', 'iu' => 'iku', 'ie' => 'ile', 'ia' => 'ina', 'id' => 'ind', + 'ik' => 'ipk', + 'is' => 'isl', 'it' => 'ita', 'jv' => 'jav', 'ja' => 'jpn', 'kl' => 'kal', 'kn' => 'kan', 'ks' => 'kas', + 'ka' => 'kat', 'kr' => 'kau', 'kk' => 'kaz', - 'mn' => 'mon', 'km' => 'khm', 'ki' => 'kik', 'rw' => 'kin', 'ky' => 'kir', - 'ku' => 'kur', - 'kg' => 'kon', 'kv' => 'kom', + 'kg' => 'kon', 'ko' => 'kor', 'kj' => 'kua', + 'ku' => 'kur', 'lo' => 'lao', 'la' => 'lat', 'lv' => 'lav', @@ -749,32 +743,36 @@ abstract class AbstractLanguageDataProviderTest extends AbstractDataProviderTest 'lb' => 'ltz', 'lu' => 'lub', 'lg' => 'lug', - 'mk' => 'mkd', 'mh' => 'mah', 'ml' => 'mal', - 'mi' => 'mri', 'mr' => 'mar', - 'ms' => 'msa', + 'mk' => 'mkd', 'mg' => 'mlg', 'mt' => 'mlt', + 'mn' => 'mon', + 'mi' => 'mri', + 'ms' => 'msa', + 'my' => 'mya', 'na' => 'nau', 'nv' => 'nav', 'nr' => 'nbl', 'nd' => 'nde', 'ng' => 'ndo', 'ne' => 'nep', + 'nl' => 'nld', 'nn' => 'nno', 'nb' => 'nob', 'ny' => 'nya', 'oc' => 'oci', 'oj' => 'oji', 'or' => 'ori', + 'om' => 'orm', 'os' => 'oss', 'pa' => 'pan', - 'ps' => 'pus', 'pi' => 'pli', 'pl' => 'pol', 'pt' => 'por', + 'ps' => 'pus', 'qu' => 'que', 'rm' => 'roh', 'ro' => 'ron', @@ -782,7 +780,6 @@ abstract class AbstractLanguageDataProviderTest extends AbstractDataProviderTest 'ru' => 'rus', 'sg' => 'sag', 'sa' => 'san', - 'sr' => 'srp', 'si' => 'sin', 'sk' => 'slk', 'sl' => 'slv', @@ -793,7 +790,9 @@ abstract class AbstractLanguageDataProviderTest extends AbstractDataProviderTest 'so' => 'som', 'st' => 'sot', 'es' => 'spa', + 'sq' => 'sqi', 'sc' => 'srd', + 'sr' => 'srp', 'ss' => 'ssw', 'su' => 'sun', 'sw' => 'swa', @@ -823,6 +822,7 @@ abstract class AbstractLanguageDataProviderTest extends AbstractDataProviderTest 'yi' => 'yid', 'yo' => 'yor', 'za' => 'zha', + 'zh' => 'zho', 'zu' => 'zul', ]; diff --git a/src/Symfony/Component/Routing/RouterInterface.php b/src/Symfony/Component/Routing/RouterInterface.php index a10ae34e07..8a3e33dc22 100644 --- a/src/Symfony/Component/Routing/RouterInterface.php +++ b/src/Symfony/Component/Routing/RouterInterface.php @@ -26,6 +26,9 @@ interface RouterInterface extends UrlMatcherInterface, UrlGeneratorInterface /** * Gets the RouteCollection instance associated with this Router. * + * WARNING: This method should never be used at runtime as it is SLOW. + * You might use it in a cache warmer though. + * * @return RouteCollection A RouteCollection instance */ public function getRouteCollection();