| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 | <?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Component\Config\Definition\Builder;/** * This class provides a fluent interface for building a node. * * @author Johannes M. Schmitt <schmittjoh@gmail.com> */class NodeBuilder implements NodeParentInterface{    protected $parent;    protected $nodeMapping;    public function __construct()    {        $this->nodeMapping = [            'variable' => VariableNodeDefinition::class,            'scalar' => ScalarNodeDefinition::class,            'boolean' => BooleanNodeDefinition::class,            'integer' => IntegerNodeDefinition::class,            'float' => FloatNodeDefinition::class,            'array' => ArrayNodeDefinition::class,            'enum' => EnumNodeDefinition::class,        ];    }    /**     * Set the parent node.     *     * @return $this     */    public function setParent(?ParentNodeDefinitionInterface $parent = null)    {        $this->parent = $parent;        return $this;    }    /**     * Creates a child array node.     *     * @return ArrayNodeDefinition     */    public function arrayNode(string $name)    {        return $this->node($name, 'array');    }    /**     * Creates a child scalar node.     *     * @return ScalarNodeDefinition     */    public function scalarNode(string $name)    {        return $this->node($name, 'scalar');    }    /**     * Creates a child Boolean node.     *     * @return BooleanNodeDefinition     */    public function booleanNode(string $name)    {        return $this->node($name, 'boolean');    }    /**     * Creates a child integer node.     *     * @return IntegerNodeDefinition     */    public function integerNode(string $name)    {        return $this->node($name, 'integer');    }    /**     * Creates a child float node.     *     * @return FloatNodeDefinition     */    public function floatNode(string $name)    {        return $this->node($name, 'float');    }    /**     * Creates a child EnumNode.     *     * @return EnumNodeDefinition     */    public function enumNode(string $name)    {        return $this->node($name, 'enum');    }    /**     * Creates a child variable node.     *     * @return VariableNodeDefinition     */    public function variableNode(string $name)    {        return $this->node($name, 'variable');    }    /**     * Returns the parent node.     *     * @return NodeDefinition&ParentNodeDefinitionInterface     */    public function end()    {        return $this->parent;    }    /**     * Creates a child node.     *     * @return NodeDefinition     *     * @throws \RuntimeException When the node type is not registered     * @throws \RuntimeException When the node class is not found     */    public function node(?string $name, string $type)    {        $class = $this->getNodeClass($type);        $node = new $class($name);        $this->append($node);        return $node;    }    /**     * Appends a node definition.     *     * Usage:     *     *     $node = new ArrayNodeDefinition('name')     *         ->children()     *             ->scalarNode('foo')->end()     *             ->scalarNode('baz')->end()     *             ->append($this->getBarNodeDefinition())     *         ->end()     *     ;     *     * @return $this     */    public function append(NodeDefinition $node)    {        if ($node instanceof BuilderAwareInterface) {            $builder = clone $this;            $builder->setParent(null);            $node->setBuilder($builder);        }        if (null !== $this->parent) {            $this->parent->append($node);            // Make this builder the node parent to allow for a fluid interface            $node->setParent($this);        }        return $this;    }    /**     * Adds or overrides a node Type.     *     * @param string $type  The name of the type     * @param string $class The fully qualified name the node definition class     *     * @return $this     */    public function setNodeClass(string $type, string $class)    {        $this->nodeMapping[strtolower($type)] = $class;        return $this;    }    /**     * Returns the class name of the node definition.     *     * @return string     *     * @throws \RuntimeException When the node type is not registered     * @throws \RuntimeException When the node class is not found     */    protected function getNodeClass(string $type)    {        $type = strtolower($type);        if (!isset($this->nodeMapping[$type])) {            throw new \RuntimeException(sprintf('The node type "%s" is not registered.', $type));        }        $class = $this->nodeMapping[$type];        if (!class_exists($class)) {            throw new \RuntimeException(sprintf('The node class "%s" does not exist.', $class));        }        return $class;    }}
 |