Skip to content

[FrameworkBundle][Routing] Boolean container parameters for routes trigger cache refresh on each request #40017

Closed
@HypeMC

Description

@HypeMC

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions