Файл: symfony-2.7/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php
Строк: 554
<?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 SymfonyBundleFrameworkBundleConsoleDescriptor;
use SymfonyComponentDependencyInjectionAlias;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentDependencyInjectionDefinition;
use SymfonyComponentDependencyInjectionParameterBagParameterBag;
use SymfonyComponentDependencyInjectionReference;
use SymfonyComponentEventDispatcherEventDispatcherInterface;
use SymfonyComponentRoutingRoute;
use SymfonyComponentRoutingRouteCollection;
/**
* @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
*
* @internal
*/
class MarkdownDescriptor extends Descriptor
{
/**
* {@inheritdoc}
*/
protected function describeRouteCollection(RouteCollection $routes, array $options = array())
{
$first = true;
foreach ($routes->all() as $name => $route) {
if ($first) {
$first = false;
} else {
$this->write("nn");
}
$this->describeRoute($route, array('name' => $name));
}
$this->write("n");
}
/**
* {@inheritdoc}
*/
protected function describeRoute(Route $route, array $options = array())
{
$requirements = $route->getRequirements();
unset($requirements['_scheme'], $requirements['_method']);
$output = '- Path: '.$route->getPath()
."n".'- Path Regex: '.$route->compile()->getRegex()
."n".'- Host: '.('' !== $route->getHost() ? $route->getHost() : 'ANY')
."n".'- Host Regex: '.('' !== $route->getHost() ? $route->compile()->getHostRegex() : '')
."n".'- Scheme: '.($route->getSchemes() ? implode('|', $route->getSchemes()) : 'ANY')
."n".'- Method: '.($route->getMethods() ? implode('|', $route->getMethods()) : 'ANY')
."n".'- Class: '.get_class($route)
."n".'- Defaults: '.$this->formatRouterConfig($route->getDefaults())
."n".'- Requirements: '.($requirements ? $this->formatRouterConfig($requirements) : 'NO CUSTOM')
."n".'- Options: '.$this->formatRouterConfig($route->getOptions());
$this->write(isset($options['name'])
? $options['name']."n".str_repeat('-', strlen($options['name']))."nn".$output
: $output);
$this->write("n");
}
/**
* {@inheritdoc}
*/
protected function describeContainerParameters(ParameterBag $parameters, array $options = array())
{
$this->write("Container parametersn====================n");
foreach ($this->sortParameters($parameters) as $key => $value) {
$this->write(sprintf("n- `%s`: `%s`", $key, $this->formatParameter($value)));
}
}
/**
* {@inheritdoc}
*/
protected function describeContainerTags(ContainerBuilder $builder, array $options = array())
{
$showPrivate = isset($options['show_private']) && $options['show_private'];
$this->write("Container tagsn==============");
foreach ($this->findDefinitionsByTag($builder, $showPrivate) as $tag => $definitions) {
$this->write("nn".$tag."n".str_repeat('-', strlen($tag)));
foreach ($definitions as $serviceId => $definition) {
$this->write("nn");
$this->describeContainerDefinition($definition, array('omit_tags' => true, 'id' => $serviceId));
}
}
}
/**
* {@inheritdoc}
*/
protected function describeContainerService($service, array $options = array())
{
if (!isset($options['id'])) {
throw new InvalidArgumentException('An "id" option must be provided.');
}
$childOptions = array('id' => $options['id'], 'as_array' => true);
if ($service instanceof Alias) {
$this->describeContainerAlias($service, $childOptions);
} elseif ($service instanceof Definition) {
$this->describeContainerDefinition($service, $childOptions);
} else {
$this->write(sprintf("**`%s`:** `%s`", $options['id'], get_class($service)));
}
}
/**
* {@inheritdoc}
*/
protected function describeContainerServices(ContainerBuilder $builder, array $options = array())
{
$showPrivate = isset($options['show_private']) && $options['show_private'];
$title = $showPrivate ? 'Public and private services' : 'Public services';
if (isset($options['tag'])) {
$title .= ' with tag `'.$options['tag'].'`';
}
$this->write($title."n".str_repeat('=', strlen($title)));
$serviceIds = isset($options['tag']) && $options['tag'] ? array_keys($builder->findTaggedServiceIds($options['tag'])) : $builder->getServiceIds();
$showPrivate = isset($options['show_private']) && $options['show_private'];
$services = array('definitions' => array(), 'aliases' => array(), 'services' => array());
foreach ($this->sortServiceIds($serviceIds) as $serviceId) {
$service = $this->resolveServiceDefinition($builder, $serviceId);
if ($service instanceof Alias) {
$services['aliases'][$serviceId] = $service;
} elseif ($service instanceof Definition) {
if (($showPrivate || $service->isPublic())) {
$services['definitions'][$serviceId] = $service;
}
} else {
$services['services'][$serviceId] = $service;
}
}
if (!empty($services['definitions'])) {
$this->write("nnDefinitionsn-----------n");
foreach ($services['definitions'] as $id => $service) {
$this->write("n");
$this->describeContainerDefinition($service, array('id' => $id));
}
}
if (!empty($services['aliases'])) {
$this->write("nnAliasesn-------n");
foreach ($services['aliases'] as $id => $service) {
$this->write("n");
$this->describeContainerAlias($service, array('id' => $id));
}
}
if (!empty($services['services'])) {
$this->write("nnServicesn--------n");
foreach ($services['services'] as $id => $service) {
$this->write("n");
$this->write(sprintf('- `%s`: `%s`', $id, get_class($service)));
}
}
}
/**
* {@inheritdoc}
*/
protected function describeContainerDefinition(Definition $definition, array $options = array())
{
$output = '- Class: `'.$definition->getClass().'`'
."n".'- Scope: `'.$definition->getScope().'`'
."n".'- Public: '.($definition->isPublic() ? 'yes' : 'no')
."n".'- Synthetic: '.($definition->isSynthetic() ? 'yes' : 'no')
."n".'- Lazy: '.($definition->isLazy() ? 'yes' : 'no')
;
if (method_exists($definition, 'isSynchronized')) {
$output .= "n".'- Synchronized: '.($definition->isSynchronized(false) ? 'yes' : 'no');
}
$output .= "n".'- Abstract: '.($definition->isAbstract() ? 'yes' : 'no');
if ($definition->getFile()) {
$output .= "n".'- File: `'.$definition->getFile().'`';
}
if ($definition->getFactoryClass(false)) {
$output .= "n".'- Factory Class: `'.$definition->getFactoryClass(false).'`';
}
if ($definition->getFactoryService(false)) {
$output .= "n".'- Factory Service: `'.$definition->getFactoryService(false).'`';
}
if ($definition->getFactoryMethod(false)) {
$output .= "n".'- Factory Method: `'.$definition->getFactoryMethod(false).'`';
}
if ($factory = $definition->getFactory()) {
if (is_array($factory)) {
if ($factory[0] instanceof Reference) {
$output .= "n".'- Factory Service: `'.$factory[0].'`';
} elseif ($factory[0] instanceof Definition) {
throw new InvalidArgumentException('Factory is not describable.');
} else {
$output .= "n".'- Factory Class: `'.$factory[0].'`';
}
$output .= "n".'- Factory Method: `'.$factory[1].'`';
} else {
$output .= "n".'- Factory Function: `'.$factory.'`';
}
}
if (!(isset($options['omit_tags']) && $options['omit_tags'])) {
foreach ($definition->getTags() as $tagName => $tagData) {
foreach ($tagData as $parameters) {
$output .= "n".'- Tag: `'.$tagName.'`';
foreach ($parameters as $name => $value) {
$output .= "n".' - '.ucfirst($name).': '.$value;
}
}
}
}
$this->write(isset($options['id']) ? sprintf("%sn%snn%sn", $options['id'], str_repeat('~', strlen($options['id'])), $output) : $output);
}
/**
* {@inheritdoc}
*/
protected function describeContainerAlias(Alias $alias, array $options = array())
{
$output = '- Service: `'.$alias.'`'
."n".'- Public: '.($alias->isPublic() ? 'yes' : 'no');
$this->write(isset($options['id']) ? sprintf("%sn%snn%sn", $options['id'], str_repeat('~', strlen($options['id'])), $output) : $output);
}
/**
* {@inheritdoc}
*/
protected function describeContainerParameter($parameter, array $options = array())
{
$this->write(isset($options['parameter']) ? sprintf("%sn%snn%s", $options['parameter'], str_repeat('=', strlen($options['parameter'])), $this->formatParameter($parameter)) : $parameter);
}
/**
* {@inheritdoc}
*/
protected function describeEventDispatcherListeners(EventDispatcherInterface $eventDispatcher, array $options = array())
{
$event = array_key_exists('event', $options) ? $options['event'] : null;
$title = 'Registered listeners';
if (null !== $event) {
$title .= sprintf(' for event `%s` ordered by descending priority', $event);
}
$this->write(sprintf('# %s', $title)."n");
$registeredListeners = $eventDispatcher->getListeners($event);
if (null !== $event) {
foreach ($registeredListeners as $order => $listener) {
$this->write("n".sprintf('## Listener %d', $order + 1)."n");
$this->describeCallable($listener);
}
} else {
ksort($registeredListeners);
foreach ($registeredListeners as $eventListened => $eventListeners) {
$this->write("n".sprintf('## %s', $eventListened)."n");
foreach ($eventListeners as $order => $eventListener) {
$this->write("n".sprintf('### Listener %d', $order + 1)."n");
$this->describeCallable($eventListener);
}
}
}
}
/**
* {@inheritdoc}
*/
protected function describeCallable($callable, array $options = array())
{
$string = '';
if (is_array($callable)) {
$string .= "n- Type: `function`";
if (is_object($callable[0])) {
$string .= "n".sprintf('- Name: `%s`', $callable[1]);
$string .= "n".sprintf('- Class: `%s`', get_class($callable[0]));
} else {
if (0 !== strpos($callable[1], 'parent::')) {
$string .= "n".sprintf('- Name: `%s`', $callable[1]);
$string .= "n".sprintf('- Class: `%s`', $callable[0]);
$string .= "n- Static: yes";
} else {
$string .= "n".sprintf('- Name: `%s`', substr($callable[1], 8));
$string .= "n".sprintf('- Class: `%s`', $callable[0]);
$string .= "n- Static: yes";
$string .= "n- Parent: yes";
}
}
return $this->write($string."n");
}
if (is_string($callable)) {
$string .= "n- Type: `function`";
if (false === strpos($callable, '::')) {
$string .= "n".sprintf('- Name: `%s`', $callable);
} else {
$callableParts = explode('::', $callable);
$string .= "n".sprintf('- Name: `%s`', $callableParts[1]);
$string .= "n".sprintf('- Class: `%s`', $callableParts[0]);
$string .= "n- Static: yes";
}
return $this->write($string."n");
}
if ($callable instanceof Closure) {
$string .= "n- Type: `closure`";
return $this->write($string."n");
}
if (method_exists($callable, '__invoke')) {
$string .= "n- Type: `object`";
$string .= "n".sprintf('- Name: `%s`', get_class($callable));
return $this->write($string."n");
}
throw new InvalidArgumentException('Callable is not describable.');
}
/**
* @param array $array
*
* @return string
*/
private function formatRouterConfig(array $array)
{
if (!count($array)) {
return 'NONE';
}
$string = '';
ksort($array);
foreach ($array as $name => $value) {
$string .= "n".' - `'.$name.'`: '.$this->formatValue($value);
}
return $string;
}
}