Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit f6043bb

Browse filesBrowse files
committed
feature #22624 debug:container --types (classes/interfaces) (weaverryan)
This PR was squashed before being merged into the 3.3-dev branch (closes #22624). Discussion ---------- debug:container --types (classes/interfaces) | Q | A | ------------- | --- | Branch? | master | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | none, but needed in symfony/symfony-docs#7807 | License | MIT | Doc PR | n/a In Symfony 3.3, the *type* (i.e. class/interface) is the most important thing about a service. But, we don't have a way for the user to know *what* types are available. This builds on top of `debug:container` to make `debug:container --types`: <img width="1272" alt="screen shot 2017-05-03 at 3 42 37 pm" src="https://cloud.githubusercontent.com/assets/121003/25678671/8bebacaa-3018-11e7-9cf6-b7654e2cae88.png"> I think we need this for 3.3, so I've made the diff as *small* as possible. We could make improvements for 3.4, but just *having* this is the most important. I could even remove `format` support to make the diff smaller. ~~This depends on #22385, which fixes a "bug" where private services aren't really shown.~~ Thanks! Commits ------- 25a39c2 debug:container --types (classes/interfaces)
2 parents eeafabb + 25a39c2 commit f6043bb
Copy full SHA for f6043bb

File tree

6 files changed

+48
-6
lines changed
Filter options

6 files changed

+48
-6
lines changed

‎src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php
+23-1Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ protected function configure()
5050
new InputOption('tags', null, InputOption::VALUE_NONE, 'Displays tagged services for an application'),
5151
new InputOption('parameter', null, InputOption::VALUE_REQUIRED, 'Displays a specific parameter for an application'),
5252
new InputOption('parameters', null, InputOption::VALUE_NONE, 'Displays parameters for an application'),
53+
new InputOption('types', null, InputOption::VALUE_NONE, 'Displays types (classes/interfaces) available in the container'),
5354
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'),
5455
new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw description'),
5556
))
@@ -63,6 +64,10 @@ protected function configure()
6364
6465
<info>php %command.full_name% validator</info>
6566
67+
To see available types that can be used for autowiring, use the <info>--types</info> flag:
68+
69+
<info>php %command.full_name% --types</info>
70+
6671
By default, private services are hidden. You can display all services by
6772
using the <info>--show-private</info> flag:
6873
@@ -100,7 +105,10 @@ protected function execute(InputInterface $input, OutputInterface $output)
100105
$this->validateInput($input);
101106
$object = $this->getContainerBuilder();
102107

103-
if ($input->getOption('parameters')) {
108+
if ($input->getOption('types')) {
109+
$options = array('show_private' => true);
110+
$options['filter'] = array($this, 'filterToServiceTypes');
111+
} elseif ($input->getOption('parameters')) {
104112
$parameters = array();
105113
foreach ($object->getParameterBag()->all() as $k => $v) {
106114
$parameters[$k] = $object->resolveEnvPlaceholders($v);
@@ -221,4 +229,18 @@ private function findServiceIdsContaining(ContainerBuilder $builder, $name)
221229

222230
return $foundServiceIds;
223231
}
232+
233+
/**
234+
* @internal
235+
*/
236+
public function filterToServiceTypes($serviceId)
237+
{
238+
// filter out things that could not be valid class names
239+
if (!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+$/', $serviceId)) {
240+
return false;
241+
}
242+
243+
// see if the class exists (only need to trigger autoload once)
244+
return class_exists($serviceId) || interface_exists($serviceId, false);
245+
}
224246
}

‎src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ protected function describeContainerServices(ContainerBuilder $builder, array $o
105105
$showArguments = isset($options['show_arguments']) && $options['show_arguments'];
106106
$data = array('definitions' => array(), 'aliases' => array(), 'services' => array());
107107

108+
if (isset($options['filter'])) {
109+
$serviceIds = array_filter($serviceIds, $options['filter']);
110+
}
111+
108112
foreach ($this->sortServiceIds($serviceIds) as $serviceId) {
109113
$service = $this->resolveServiceDefinition($builder, $serviceId);
110114

‎src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ protected function describeContainerServices(ContainerBuilder $builder, array $o
131131
$showArguments = isset($options['show_arguments']) && $options['show_arguments'];
132132
$services = array('definitions' => array(), 'aliases' => array(), 'services' => array());
133133

134+
if (isset($options['filter'])) {
135+
$serviceIds = array_filter($serviceIds, $options['filter']);
136+
}
137+
134138
foreach ($this->sortServiceIds($serviceIds) as $serviceId) {
135139
$service = $this->resolveServiceDefinition($builder, $serviceId);
136140

‎src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php
+9-3Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,10 @@ protected function describeContainerServices(ContainerBuilder $builder, array $o
186186
$serviceIds = isset($options['tag']) && $options['tag'] ? array_keys($builder->findTaggedServiceIds($options['tag'])) : $builder->getServiceIds();
187187
$maxTags = array();
188188

189+
if (isset($options['filter'])) {
190+
$serviceIds = array_filter($serviceIds, $options['filter']);
191+
}
192+
189193
foreach ($serviceIds as $key => $serviceId) {
190194
$definition = $this->resolveServiceDefinition($builder, $serviceId);
191195
if ($definition instanceof Definition) {
@@ -220,8 +224,10 @@ protected function describeContainerServices(ContainerBuilder $builder, array $o
220224

221225
$tableHeaders = array_merge(array('Service ID'), $tagsNames, array('Class name'));
222226
$tableRows = array();
227+
$rawOutput = isset($options['raw_text']) && $options['raw_text'];
223228
foreach ($this->sortServiceIds($serviceIds) as $serviceId) {
224229
$definition = $this->resolveServiceDefinition($builder, $serviceId);
230+
$styledServiceId = $rawOutput ? $serviceId : sprintf('<fg=cyan>%s</fg=cyan>', $serviceId);
225231
if ($definition instanceof Definition) {
226232
if ($showTag) {
227233
foreach ($definition->getTag($showTag) as $key => $tag) {
@@ -236,13 +242,13 @@ protected function describeContainerServices(ContainerBuilder $builder, array $o
236242
}
237243
}
238244
} else {
239-
$tableRows[] = array($serviceId, $definition->getClass());
245+
$tableRows[] = array($styledServiceId, $definition->getClass());
240246
}
241247
} elseif ($definition instanceof Alias) {
242248
$alias = $definition;
243-
$tableRows[] = array_merge(array($serviceId, sprintf('alias for "%s"', $alias)), $tagsCount ? array_fill(0, $tagsCount, '') : array());
249+
$tableRows[] = array_merge(array($styledServiceId, sprintf('alias for "%s"', $alias)), $tagsCount ? array_fill(0, $tagsCount, '') : array());
244250
} else {
245-
$tableRows[] = array_merge(array($serviceId, get_class($definition)), $tagsCount ? array_fill(0, $tagsCount, '') : array());
251+
$tableRows[] = array_merge(array($styledServiceId, get_class($definition)), $tagsCount ? array_fill(0, $tagsCount, '') : array());
246252
}
247253
}
248254

‎src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php
+7-2Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ protected function describeContainerService($service, array $options = array(),
7979
*/
8080
protected function describeContainerServices(ContainerBuilder $builder, array $options = array())
8181
{
82-
$this->writeDocument($this->getContainerServicesDocument($builder, isset($options['tag']) ? $options['tag'] : null, isset($options['show_private']) && $options['show_private'], isset($options['show_arguments']) && $options['show_arguments']));
82+
$this->writeDocument($this->getContainerServicesDocument($builder, isset($options['tag']) ? $options['tag'] : null, isset($options['show_private']) && $options['show_private'], isset($options['show_arguments']) && $options['show_arguments'], isset($options['filter']) ? $options['filter'] : null));
8383
}
8484

8585
/**
@@ -307,16 +307,21 @@ private function getContainerServiceDocument($service, $id, ContainerBuilder $bu
307307
* @param string|null $tag
308308
* @param bool $showPrivate
309309
* @param bool $showArguments
310+
* @param callable $filter
310311
*
311312
* @return \DOMDocument
312313
*/
313-
private function getContainerServicesDocument(ContainerBuilder $builder, $tag = null, $showPrivate = false, $showArguments = false)
314+
private function getContainerServicesDocument(ContainerBuilder $builder, $tag = null, $showPrivate = false, $showArguments = false, $filter = null)
314315
{
315316
$dom = new \DOMDocument('1.0', 'UTF-8');
316317
$dom->appendChild($containerXML = $dom->createElement('container'));
317318

318319
$serviceIds = $tag ? array_keys($builder->findTaggedServiceIds($tag)) : $builder->getServiceIds();
319320

321+
if ($filter) {
322+
$serviceIds = array_filter($serviceIds, $filter);
323+
}
324+
320325
foreach ($this->sortServiceIds($serviceIds) as $serviceId) {
321326
$service = $this->resolveServiceDefinition($builder, $serviceId);
322327

‎src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/AbstractDescriptorTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/AbstractDescriptorTest.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ abstract protected function getFormat();
183183
private function assertDescription($expectedDescription, $describedObject, array $options = array())
184184
{
185185
$options['raw_output'] = true;
186+
$options['raw_text'] = true;
186187
$output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true);
187188

188189
if ('txt' === $this->getFormat()) {

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.