Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我如何验证“下的配置”;参数“;根?_Php_Validation_Symfony_Yaml - Fatal编程技术网

Php 我如何验证“下的配置”;参数“;根?

Php 我如何验证“下的配置”;参数“;根?,php,validation,symfony,yaml,Php,Validation,Symfony,Yaml,我在Symfony 2.3.x上做一个项目 在MyBundle\Resources\config\services.yml中,我将服务定义为: services: myservice: class : MyServiceClass arguments: [%settings%] 服务参数中的设置在MyBundle\Resources\config\parameters.yml文件中定义: parameters: settings:

我在Symfony 2.3.x上做一个项目

MyBundle\Resources\config\services.yml
中,我将服务定义为:

services:
    myservice:
        class : MyServiceClass
        arguments: [%settings%]
服务参数中的
设置
MyBundle\Resources\config\parameters.yml
文件中定义:

parameters:
    settings:
        setting1: 15
        setting2: true
一切都很好,但我想验证这个文件。因此,在
MyBundle\DependencyInjection\Configuration
文件中,我有以下内容:

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('parameters');

        $rootNode->children()
            ->arrayNode('settings')
                ->isRequired()
                ->cannotBeEmpty()
                ->children()
                    ->integerNode('setting1')->isRequired()->cannotBeEmpty()->min(1)->end()
                    ->booleanNode('setting2')->isRequired()->cannotBeEmpty()->defaultTrue()->end()
                ->end()
            ->end();

        return $treeBuilder;
    }
}
class MyExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $processor = new Processor();
        $configuration = new Configuration();
        $processedConfiguration = $processor->processConfiguration(
            $configuration,
            $configs
        );

        $configLoader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $configLoader->load('services.yml');
        $configLoader->load('parameters.yml');
    }
}
在我的
MyBundle\DependencyInjection\MyExtension
文件中,我有以下内容:

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('parameters');

        $rootNode->children()
            ->arrayNode('settings')
                ->isRequired()
                ->cannotBeEmpty()
                ->children()
                    ->integerNode('setting1')->isRequired()->cannotBeEmpty()->min(1)->end()
                    ->booleanNode('setting2')->isRequired()->cannotBeEmpty()->defaultTrue()->end()
                ->end()
            ->end();

        return $treeBuilder;
    }
}
class MyExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $processor = new Processor();
        $configuration = new Configuration();
        $processedConfiguration = $processor->processConfiguration(
            $configuration,
            $configs
        );

        $configLoader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $configLoader->load('services.yml');
        $configLoader->load('parameters.yml');
    }
}

一切正常,但问题是,如果我将
配置
min(1)
更改为
min(100)
,功能应该会中断,并告诉我参数不正常。然而,不管我做什么,它都会继续工作

因此,验证在某种程度上被忽略了。我觉得我在这里做了一些根本错误的事情(比如根节点应该以另一种方式初始化),但我不知道发生了什么

我能找到的关于这方面的唯一文档是在。但是这里没有提到将
参数
作为根节点的配置文件(据我所知,这些配置文件是以特殊方式处理的)

如何使验证代码实际验证配置文件

先谢谢你


更新

我刚刚发现的另一个线索是,如果我首先加载
parameters.yml
文件,然后调用
$processor->processConfiguration
,那么我会得到异常:

InvalidConfigurationException: The child node "settings" at path "parameters" must be configured.

参数
部分是容器配置的一部分,而不是捆绑配置的一部分。因此,您可以检查构造函数中的参数以查看参数是否正确,或者不使用parameters部分并将其移动到bundle配置

由于这些设置是正确的配置设置,我建议您将它们放在configuration类中

配置类中
根元素的名称没有任何作用。使用捆绑包的di别名(例如AcmeDemoBundle->
acme\u demo
)。我建议从配置中删除“设置”节点,因为其中的所有内容都是设置。现在您可以将其放入
config.yml

acme_demo:
    setting1: 10
    setting2: false
在此之后,bundle扩展中的
$processedConfiguration
变量(顺便说一句,该变量中不应该有“bundle”)现在有一个类似
array的数组('setting1'=>10,'setting2'=>false)
。您可以使用它来设置参数:

public function load(array $configs, ContainerBuilder $container)
{
    // ...

    $container->setParameter('acme_demo.settings', $processedConfiguration);
}

我还建议使用更合理的名称,“setting1”和“setting2”并不能说明设置在做什么。

我的结论是,在今天的Symfony框架实现中,没有办法实现我想要的功能。也许我会尝试自己实现它,并为它发出一个pull请求,此时我将编辑此答案并添加所需的信息。

您的解决方案会起作用,但我需要在
MyBundle\Resources\config
中维护配置文件,并且它必须保持其结构(除了
参数
根以外,我可以更改为我想要的任何参数)。如果你知道它的任何工作方式,请告诉我,我真的很感激。我在这方面花费了数小时……但没有成功。@RaduMurzea如第一句所说,你需要在
MyService
classOK的构造函数中进行验证,但是在
MyService
s构造函数中,我如何调用验证通过了吗?我是手动调用
MyExtension::load
还是
Configuration::getConfigTreeBuilder
?这似乎不对。实际的代码是什么样子的?你能编辑你的答案并添加一段代码,这样我就可以真正了解这一点吗?(不必是完美的或完整的,只是一个提示)漂亮的请:)。谢谢。@RaduMurzea只需使用简单的if语句:
if(!isset($settings['setting1'])| |!is_int($settings['setting1'])|$settings['setting1']<1){//…failure}