Merge branch '4.4' into 5.2

* 4.4:
  [HttpKernel] fix transient test
  [FrameworkBundle] Fix freshness checks with boolean parameters on routes
  [FrameworkBundle] fix registering "annotations.cache" on the "container.hot_path"
  Add some information about the username in CONTRIBUTORS
This commit is contained in:
Nicolas Grekas 2021-02-10 18:26:35 +01:00
commit 0a26f1be0b
6 changed files with 73 additions and 11 deletions

View File

@ -1,8 +1,11 @@
CONTRIBUTORS CONTRIBUTORS
============ ============
Symfony is the result of the work of many people who made the code better Symfony is the result of the work of many people who made the code better.
(see https://symfony.com/contributors for more information):
The Symfony Connect username in parenthesis allows to get more information
about contributors (like https://connect.symfony.com/profile/fabpot). See
https://symfony.com/contributors for more information.
- Fabien Potencier (fabpot) - Fabien Potencier (fabpot)
- Nicolas Grekas (nicolas-grekas) - Nicolas Grekas (nicolas-grekas)

View File

@ -61,6 +61,7 @@ return static function (ContainerConfigurator $container) {
service('cache.annotations'), service('cache.annotations'),
]), ]),
]) ])
->tag('container.hot_path')
->alias('annotation_reader', 'annotations.reader') ->alias('annotation_reader', 'annotations.reader')
->alias(Reader::class, 'annotation_reader'); ->alias(Reader::class, 'annotation_reader');

View File

@ -180,14 +180,16 @@ class Router extends BaseRouter implements WarmableInterface, ServiceSubscriberI
$resolved = ($this->paramFetcher)($match[1]); $resolved = ($this->paramFetcher)($match[1]);
if (\is_bool($resolved)) { if (is_scalar($resolved)) {
$resolved = (string) (int) $resolved;
}
if (\is_string($resolved) || is_numeric($resolved)) {
$this->collectedParameters[$match[1]] = $resolved; $this->collectedParameters[$match[1]] = $resolved;
return (string) $this->resolve($resolved); if (\is_string($resolved)) {
$resolved = $this->resolve($resolved);
}
if (is_scalar($resolved)) {
return false === $resolved ? '0' : (string) $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, get_debug_type($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, get_debug_type($resolved)));

View File

@ -0,0 +1,3 @@
foo:
path: /foo
condition: '%parameter.condition%'

View File

@ -14,11 +14,16 @@ namespace Symfony\Bundle\FrameworkBundle\Tests\Routing;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
use Symfony\Bundle\FrameworkBundle\Routing\Router; use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\Config\ResourceCheckerConfigCache;
use Symfony\Component\Config\ResourceCheckerConfigCacheFactory;
use Symfony\Component\DependencyInjection\Config\ContainerParametersResource; use Symfony\Component\DependencyInjection\Config\ContainerParametersResource;
use Symfony\Component\DependencyInjection\Config\ContainerParametersResourceChecker;
use Symfony\Component\DependencyInjection\Container; use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException; use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException; use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\Routing\Route; use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\RouteCollection;
@ -503,6 +508,51 @@ class RouterTest extends TestCase
return [[null], [false], [true], [new \stdClass()], [['foo', 'bar']], [[[]]]]; return [[null], [false], [true], [new \stdClass()], [['foo', 'bar']], [[[]]]];
} }
/**
* @dataProvider getContainerParameterForRoute
*/
public function testCacheValiditiyWithContainerParameters($parameter)
{
$cacheDir = sys_get_temp_dir().\DIRECTORY_SEPARATOR.uniqid('router_', true);
try {
$container = new Container();
$container->set('routing.loader', new YamlFileLoader(new FileLocator(__DIR__.'/Fixtures')));
$container->setParameter('parameter.condition', $parameter);
$router = new Router($container, 'with_condition.yaml', [
'debug' => true,
'cache_dir' => $cacheDir,
]);
$resourceCheckers = [
new ContainerParametersResourceChecker($container),
];
$router->setConfigCacheFactory(new ResourceCheckerConfigCacheFactory($resourceCheckers));
$router->getMatcher(); // trigger cache build
$cache = new ResourceCheckerConfigCache($cacheDir.\DIRECTORY_SEPARATOR.'UrlMatcher.php', $resourceCheckers);
$this->assertTrue($cache->isFresh());
} finally {
if (is_dir($cacheDir)) {
array_map('unlink', glob($cacheDir.\DIRECTORY_SEPARATOR.'*'));
rmdir($cacheDir);
}
}
}
public function getContainerParameterForRoute()
{
yield 'String' => ['"foo"'];
yield 'Integer' => [0];
yield 'Boolean true' => [true];
yield 'Boolean false' => [false];
}
private function getServiceContainer(RouteCollection $routes): Container private function getServiceContainer(RouteCollection $routes): Container
{ {
$loader = $this->createMock(LoaderInterface::class); $loader = $this->createMock(LoaderInterface::class);

View File

@ -17,6 +17,7 @@ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@ -36,8 +37,10 @@ class KernelTest extends TestCase
{ {
protected function tearDown(): void protected function tearDown(): void
{ {
$fs = new Filesystem(); try {
$fs->remove(__DIR__.'/Fixtures/var'); (new Filesystem())->remove(__DIR__.'/Fixtures/var');
} catch (IOException $e) {
}
} }
public function testConstructor() public function testConstructor()
@ -473,7 +476,7 @@ EOF
public function testKernelReset() public function testKernelReset()
{ {
(new Filesystem())->remove(__DIR__.'/Fixtures/var/cache'); $this->tearDown();
$kernel = new CustomProjectDirKernel(); $kernel = new CustomProjectDirKernel();
$kernel->boot(); $kernel->boot();