8000 [FrameworkBundle] config:dump-reference command can now dump current configuration by lyrixx · Pull Request #10165 · symfony/symfony · GitHub
[go: up one dir, main page]

Skip to content

[FrameworkBundle] config:dump-reference command can now dump current configuration #10165

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 20, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ CHANGELOG
2.5.0
-----

* Added `config:debug` command
* Added `yaml:lint` command
* Deprecated the `RouterApacheDumperCommand` which will be removed in Symfony 3.0.

Expand Down
8000
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<?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\Bundle\FrameworkBundle\Command;

use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\Extension\Extension;

/**
* A console command for dumping available configuration reference
*
* @author Kevin Bond <kevinbond@gmail.com>
* @author Wouter J <waldio.webdesign@gmail.com>
* @author Grégoire Pineau <lyrixx@lyrixx.info>
*/
class AbstractConfigCommand extends ContainerDebugCommand
{
protected function listBundles(OutputInterface $output)
{
$output->writeln('Available registered bundles with their extension alias if available:');

$table = $this->getHelperSet()->get('table');
$table->setHeaders(array('Bundle name', 'Extension alias'));
foreach ($this->getContainer()->get('kernel')->getBundles() as $bundle) {
$extension = $bundle->getContainerExtension();
$table->addRow(array($bundle->getName(), $extension ? $extension->getAlias() : ''));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if there is no extension, the bundle can't be configured nor has it a config tree. So does it makes sense to list it?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't want to break BC

}

$table->render($output);
}

protected function findExtention($name)
{
$extension = null;

$bundles = $this->getContainer()->get('kernel')->getBundles();

if (preg_match('/Bundle$/', $name)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think 'Bundle' === substr($name, -6) will be faster, doesn't it?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's harder to read. And speed does not matter here. It's not a production command, and were are talking about something like 0.001 ms ?

// input is bundle name

if (isset($bundles[$name])) {
$extension = $bundles[$name]->getContainerExtension();
}

if (!$extension) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we not add a check to see if the extension has a configuration, you can also have an extension without configuration, in that case the exception should also be thrown imo

8000 Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this method is about getting the extension, not the configuration for an extension

throw new \LogicException(sprintf('No extensions with configuration available for "%s"', $name));
}
} else {
foreach ($bundles as $bundle) {
$extension = $bundle->getContainerExtension();

if ($extension && $name === $extension->getAlias()) {
break;
}

$extension = null;
}

if (!$extension) {
throw new \LogicException(sprintf('No extension with alias "%s" is enabled', $name));
}
}

return $extension;
}

public function validateConfiguration(Extension $extension, $configuration)
{
if (!$configuration) {
throw new \LogicException(sprintf('The extension with alias "%s" does not have its getConfiguration() method setup', $extension->getAlias()));
}

if (!$configuration instanceof ConfigurationInterface) {
throw new \LogicException(sprintf('Configuration class "%s" should implement ConfigurationInterface in order to be dumpable', get_class($configuration)));
}
}
}
92 changes: 92 additions & 0 deletions src/Symfony/Bundle/FrameworkBundle/Command/ConfigDebugCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<?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\Bundle\FrameworkBundle\Command;

use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\Yaml\Yaml;

/**
* A console command for dumping available configuration reference
*
* @author Grégoire Pineau <lyrixx@lyrixx.info>
*/
class ConfigDebugCommand extends AbstractConfigCommand
{
/**
* {@inheritdoc}
*/
protected function configure()
{
$this
->setName('config:debug')
->setDefinition(array(
new InputArgument('name', InputArgument::OPTIONAL, 'The Bundle name or the extension alias'),
))
->setDescription('Dumps the current configuration for an extension')
->setHelp(<<<EOF

The <info>%command.name%</info> command dumps the current configuration for an
extension/bundle.

Either the extension alias or bundle name can be used:

<info>php %command.full_name% framework</info>
<info>php %command.full_name% FrameworkBundle</info>

EOF
)
;
}

/**
* {@inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$name = $input->getArgument('name');

if (empty($name)) {
$this->listBundles($output);

return;
}

$extension = $this->findExtention($name);

$kernel = $this->getContainer()->get('kernel');
$method = new \ReflectionMethod($kernel, 'buildContainer');
$method->setAccessible(true);
$container = $method->invoke($kernel);

$configs = $container->getExtensionConfig($extension->getAlias());
$configuration = $extension->getConfiguration($configs, $container);

$this->validateConfiguration($extension, $configuration);

$processor = new Processor();
$config = $processor->processConfiguration($configuration, $configs);

$config = $container->getParameterBag()->resolveValue($config);

if ($name === $extension->getAlias()) {
$output->writeln(sprintf('# Current configuration for extension with alias: "%s"', $name));
} else {
$output->writeln(sprintf('# Current configuration for "%s"', $name));
}

$output->writeln(Yaml::dump(array($extension->getAlias() => $config), 3));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Config\Definition\ConfigurationInterface;

/**
* A console command for dumping available configuration reference
*
* @author Kevin Bond <kevinbond@gmail.com>
* @author Wouter J <waldio.webdesign@gmail.com>
* @author Grégoire Pineau <lyrixx@lyrixx.info>
*/
class ConfigDumpReferenceCommand extends ContainerDebugCommand
class ConfigDumpReferenceCommand extends AbstractConfigCommand
{
/**
* {@inheritdoc}
Expand All @@ -43,13 +43,16 @@ protected function configure()
The <info>%command.name%</info> command dumps the default configuration for an
extension/bundle.

The extension alias or bundle name can be used:
Either the extension alias or bundle name can be used:

<info>php %command.full_name% framework</info>
<info>php %command.full_name% FrameworkBundle</info>

With the <info>format</info> option specifies the format of the configuration,
this is either <comment>yaml</comment> or <comment>xml</comment>. When the option is not provided, <comment>yaml</comment> is used.
this is either <comment>yaml</comment> or <comment>xml</comment>.
When the option is not provided, <comment>yaml</comment> is used.

<info>php %command.full_name% FrameworkBundle --format=xml</info>
EOF
)
;
Expand All @@ -62,65 +65,24 @@ protected function configure()
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$bundles = $this->getContainer() F438 ->get('kernel')->getBundles();
$containerBuilder = $this->getContainerBuilder();

$name = $input->getArgument('name');

if (empty($name)) {
$output->writeln('Available registered bundles with their extension alias if available:');

$table = $this->getHelperSet()->get('table');
$table->setHeaders(array('Bundle name', 'Extension alias'));
foreach ($bundles as $bundle) {
$extension = $bundle->getContainerExtension();
$table->addRow(array($bundle->getName(), $extension ? $extension->getAlias() : ''));
}
$table->render($output);
$this->listBundles($output);

return;
}

$extension = null;

if (preg_match('/Bundle$/', $name)) {
// input is bundle name
$extension = $this->findExtention($name);

if (isset($bundles[$name])) {
$extension = $bundles[$name]->getContainerExtension();
}
$configuration = $extension->getConfiguration(array(), $this->getContainerBuilder());

if (!$extension) {
throw new \LogicException(sprintf('No extensions with configuration available for "%s"', $name));
}
$this->validateConfiguration($extension, $configuration);

$message = 'Default configuration for "'.$name.'"';
if ($name === $extension->getAlias()) {
$message = sprintf('Default configuration for extension with alias: "%s"', $name);
} else {
foreach ($bundles as $bundle) {
$extension = $bundle->getContainerExtension();

if ($extension && $extension->getAlias() === $name) {
break;
}

$extension = null;
}

if (!$extension) {
throw new \LogicException(sprintf('No extension with alias "%s" is enabled', $name));
}

$message = 'Default configuration for extension with alias: "'.$name.'"';
}

$configuration = $extension->getConfiguration(array(), $containerBuilder);

if (!$configuration) {
throw new \LogicException(sprintf('The extension with alias "%s" does not have it\'s getConfiguration() method setup', $extension->getAlias()));
}

if (!$configuration instanceof ConfigurationInterface) {
throw new \LogicException(sprintf('Configuration class "%s" should implement ConfigurationInterface in order to be dumpable', get_class($configuration)));
$message = sprintf('Default configuration for "%s"', $name);
}

switch ($input->getOption('format')) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,6 @@ protected function configure()

/**
* {@inheritdoc}
*
* @throws \LogicException
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
Expand Down
0