【问题标题】:Cannot resolve parameter in boolean node in Symfony config files无法解析 Symfony 配置文件中布尔节点中的参数
【发布时间】:2019-07-11 15:49:34
【问题描述】:

我有一个需要布尔参数的(私有)包:

$rootNode
    ->addDefaultsIfNotSet()
    ->children()
        ->booleanNode('property_cache_enabled')->defaultTrue()->end()
    ->end()

当我希望它解析为 kernel.debug 时,它会抛出异常:

路径“rvlt_digital_symfony_api.property_cache_enabled”的类型无效。预期为布尔值,但得到字符串。

这是配置的相关部分:

rvlt_digital_symfony_api:
  property_cache_enabled: '%kernel.debug%'

如何解决?当我搜索这个问题时,我只找到了与环境变量转换相关的东西;这没有帮助,因为这不是环境变量。

【问题讨论】:

  • 有趣。没有时间制作测试用例,但我认为如果您在配置树中使用 defaultValue('%kernel.debug%') ,那么您将获得所需的结果。
  • 如果您查看框架包的配置,您可以看到调试标志被注入到构造函数中。然后各个节点使用defaultValue($this->debug)
  • @Cerad 谢谢,但这并不能解决它,真正的值是正确的默认值,我需要它从配置中解决。目前,我通过在具有true 而默认配置具有false 的dev 目录中创建一个单独的配置来解决它。

标签: php symfony symfony4


【解决方案1】:

您可以使用%kernel.debug% 的值直接配置您的模块,而无需为该值设置显式配置。

改变你的配置类,让它去:

class ApplicationConfiguration implements ConfigurationInterface
{
    private $debug;

    public function  __construct($debug)
    {
        $this->debug = (bool) $debug;
    }

    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder('rvlt_digital_symfony_api');

        $treeBuilder->getRootNode()
            ->addDefaultsIfNotSet()
            ->children()
                ->booleanNode('property_cache_enabled')->defaultValue($this->debug)->end()
            ->end();

        return $treeBuilder;
    }
}

还有您的扩展类,以便在实例化配置时,从容器中读取 %kernel.debug% 的值并注入到配置实例中:

class ApplicationExtension extends Extension
{
     public function getConfiguration(array $config, ContainerBuilder $container)
    {
        return new Configuration($container->getParameter('kernel.debug'));
    }
}

这样,如果您不设置 rvlt_digital_symfony_api.property_cache_enabled 的配置,它只会匹配应用程序的 %kernel.debug% 设置,这正是您想要的。 (不过,您仍然可以配置此值并覆盖默认值)。

这里的文档中明确讨论了这个用例:Using Parameters within a Dependency Injection Class

【讨论】:

  • 这不是我的解决方案,默认需要为真,但在我的开发机器上我希望它基于 kernel.debug 参数。
  • 不完全确定你为什么不能用这段代码完成它。只需为 devprod 使用不同的配置。
  • 这就是我最终做的,但我觉得很奇怪你需要创建单独的配置来解决一个参数。
猜你喜欢
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2013-07-25
相关资源
最近更新 更多