Closed
Description
Symfony version(s) affected: 4.4
Description
Using boolean container parameters for routes triggers a cache refresh on each request.
The bug was introduced with #30379 . The problem is that bool values get cast into a string and are stored in the meta file as "0"
or "1"
. When the ContainerParametersResourceChecker
checks whether the cache of fresh it compares a string to a bool ("1" === true
) which is always false.
How to reproduce
# routes.yaml
foo:
path: /foo
condition: '%parameter.condition%'
A simple test case:
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\ResourceCheckerConfigCache;
use Symfony\Component\Config\ResourceCheckerConfigCacheFactory;
use Symfony\Component\DependencyInjection\Config\ContainerParametersResourceChecker;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\Routing\Loader\YamlFileLoader;
$cacheDir = __DIR__.'/cache';
$container = new Container();
$container->set('routing.loader', new YamlFileLoader(new FileLocator(__DIR__.'/config')));
$container->setParameter('parameter.condition', true);
$router = new Router($container, 'routes.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);
var_dump($cache->isFresh()); // should be true, is false