<?php
/*
* This file is part of the FOSOAuthServerBundle package.
*
* (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace FOS\OAuthServerBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/**
* This is the class that validates and merges configuration from your app/config files.
*
* To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
*/
class Configuration implements ConfigurationInterface
{
/**
* {@inheritdoc}
*/
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('fos_oauth_server');
$supportedDrivers = array('orm', 'mongodb', 'propel', 'custom');
$rootNode
->validate()
->always(function($v) {
if ('custom' !== $v['db_driver']) {
return $v;
}
if (empty($v['service']['client_manager']) || $v['service']['client_manager'] === 'fos_oauth_server.client_manager.default') {
throw new \InvalidArgumentException('The service client_manager must be set explicitly for custom db_driver.');
}
if (empty($v['service']['access_token_manager']) || $v['service']['access_token_manager'] === 'fos_oauth_server.access_token_manager.default') {
throw new \InvalidArgumentException('The service access_token_manager must be set explicitly for custom db_driver.');
}
if (empty($v['service']['refresh_token_manager']) || $v['service']['refresh_token_manager'] === 'fos_oauth_server.refresh_token_manager.default') {
throw new \InvalidArgumentException('The service refresh_token_manager must be set explicitly for custom db_driver.');
}
if (empty($v['service']['auth_code_manager']) || $v['service']['auth_code_manager'] === 'fos_oauth_server.auth_code_manager.default') {
throw new \InvalidArgumentException('The service auth_code_manager must be set explicitly for custom db_driver.');
}
return $v;
})
->end()
->children()
->scalarNode('db_driver')
->validate()
->ifNotInArray($supportedDrivers)
->thenInvalid('The driver %s is not supported. Please choose one of '.json_encode($supportedDrivers))
->end()
->isRequired()
->cannotBeEmpty()
->end()
->scalarNode('client_class')->isRequired()->cannotBeEmpty()->end()
->scalarNode('access_token_class')->isRequired()->cannotBeEmpty()->end()
->scalarNode('refresh_token_class')->isRequired()->cannotBeEmpty()->end()
->scalarNode('auth_code_class')->isRequired()->cannotBeEmpty()->end()
->scalarNode('model_manager_name')->defaultNull()->end()
->end();
$this->addAuthorizeSection($rootNode);
$this->addServiceSection($rootNode);
$this->addTemplateSection($rootNode);
return $treeBuilder;
}
private function addAuthorizeSection(ArrayNodeDefinition $node)
{
$node
->children()
->arrayNode('authorize')
->addDefaultsIfNotSet()
->canBeUnset()
->children()
->arrayNode('form')
->addDefaultsIfNotSet()
->children()
->scalarNode('type')->defaultValue('fos_oauth_server_authorize')->end()
->scalarNode('handler')->defaultValue('fos_oauth_server.authorize.form.handler.default')->end()
->scalarNode('name')->defaultValue('fos_oauth_server_authorize_form')->cannotBeEmpty()->end()
->arrayNode('validation_groups')
->prototype('scalar')->end()
->defaultValue(array('Authorize', 'Default'))
->end()
->end()
->end()
->end()
->end()
->end();
}
private function addServiceSection(ArrayNodeDefinition $node)
{
$node
->addDefaultsIfNotSet()
->children()
->arrayNode('service')
->addDefaultsIfNotSet()
->children()
->scalarNode('storage')->defaultValue('fos_oauth_server.storage.default')->cannotBeEmpty()->end()
->scalarNode('user_provider')->defaultNull()->end()
->scalarNode('client_manager')->defaultValue('fos_oauth_server.client_manager.default')->end()
->scalarNode('access_token_manager')->defaultValue('fos_oauth_server.access_token_manager.default')->end()
->scalarNode('refresh_token_manager')->defaultValue('fos_oauth_server.refresh_token_manager.default')->end()
->scalarNode('auth_code_manager')->defaultValue('fos_oauth_server.auth_code_manager.default')->end()
->arrayNode('options')
->useAttributeAsKey('key')
->treatNullLike(array())
->prototype('scalar')->end()
->end()
->end()
->end()
->end()
->end();
}
private function addTemplateSection(ArrayNodeDefinition $node)
{
$node
->children()
->arrayNode('template')
->addDefaultsIfNotSet()
->children()
->scalarNode('engine')->defaultValue('twig')->end()
->end()
->end()
->end();
}
}