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:
commit
0a26f1be0b
@ -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)
|
||||||
|
@ -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');
|
||||||
|
@ -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)));
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
foo:
|
||||||
|
path: /foo
|
||||||
|
condition: '%parameter.condition%'
|
@ -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);
|
||||||
|
@ -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();
|
||||||
|
Reference in New Issue
Block a user