[FrameworkBundle] Fix freshness checks with boolean parameters on routes
This commit is contained in:
parent
5dbc7db04a
commit
af6db0cfaf
|
@ -178,14 +178,16 @@ class Router extends BaseRouter implements WarmableInterface, ServiceSubscriberI
|
|||
|
||||
$resolved = ($this->paramFetcher)($match[1]);
|
||||
|
||||
if (\is_bool($resolved)) {
|
||||
$resolved = (string) (int) $resolved;
|
||||
}
|
||||
|
||||
if (\is_string($resolved) || is_numeric($resolved)) {
|
||||
if (is_scalar($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, \gettype($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 Psr\Container\ContainerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Routing\Router;
|
||||
use Symfony\Component\Config\FileLocator;
|
||||
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\ContainerParametersResourceChecker;
|
||||
use Symfony\Component\DependencyInjection\Container;
|
||||
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
|
||||
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
|
||||
use Symfony\Component\Routing\Loader\YamlFileLoader;
|
||||
use Symfony\Component\Routing\Route;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
|
||||
|
@ -503,6 +508,51 @@ class RouterTest extends TestCase
|
|||
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
|
||||
{
|
||||
$loader = $this->createMock(LoaderInterface::class);
|
||||
|
|
Reference in New Issue