0

我正在尝试创建一个包来管理可以通过配置文件配置的菜单。

所以我在我的class DependencyInjection\Configuration.

所需的配置是必须添加到菜单中的项目数组。每个项目可以有 3 种不同的类型(link, link_notification, widget)。并且对于每种类型, item 都需要其他属性(例如routelabel等)。

配置示例:

menu:
    utilities:
        - { type: link, icon: icon_name, label: text, route: { name: route_name, params: {} } }
        - { type: link_notification, notification: notification_text }
        - { type: widget, controller: controller_name }

我被困住了,因为我找不到如何为每种类型定义不同的数组约束。

我找不到翻译条件的方法:

IF type == "link" THEN scalarNode "icon" IS REQUIRED AND scalarNode "label" IS REQUIRED ...

配置文件如下所示:

public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('aiomedia_menu');

        $rootNode
            ->children()
                ->arrayNode('utilities')
                    ->prototype('array')
                        ->children()
                            ->enumNode('type')
                                ->values(array ('link', 'link_notification', 'widget'))
                                ->isRequired()
                            ->end()
                        ->end()
                    ->end()
                ->end()
            ->end();

        return $treeBuilder;
    }

->ifXXX() [...] ->then()在 Symfony2 文档中看到了方法,但我不知道如何在这种情况下使用它们。

4

1 回答 1

1

它会是这样的:(未经测试,但它为您提供了一些寻找方向)

$rootNode
    ->children()
        ->arrayNode('utilities')
            ->prototype('array')
                ->validation()
                    ->ifTrue(function ($v) {
                        if (!is_array($v)) {
                            return true;
                        }

                        switch ($v['type']) {
                            case 'link':
                                $requiredSettings = array('icon', 'label', 'route');
                                break;

                            case 'link_notification':
                                $requiredSettings = array('notification');
                                break;

                            case 'widget':
                                $requiredSettings = array('controller');
                                break;
                        }

                        foreach ($requiredSettings as $setting) {
                            if (!array_key_exists($setting, $v)) {
                                return false;
                            }
                        }

                        return true;
                    })
                    ->thenInvalid('Missing required options for "%s"')
                ->end()
                ->children()
                    ->enumNode('type')
                        ->values(array ('link', 'link_notification', 'widget'))
                        ->isRequired()
                    ->end()
                ->end()
            ->end()
        ->end()
    ->end();
于 2013-11-03T11:45:12.853 回答