Skip to content

Commit 1972a91

Browse files
digitalkaozwebmozart
authored andcommitted
[Form] Added form debug collector
1 parent 98c0d38 commit 1972a91

File tree

12 files changed

+542
-0
lines changed

12 files changed

+542
-0
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ private function registerProfilerConfiguration(array $config, ContainerBuilder $
218218
return;
219219
}
220220

221+
$loader->load('form_debug.xml');
221222
$loader->load('profiling.xml');
222223
$loader->load('collectors.xml');
223224

src/Symfony/Bundle/FrameworkBundle/Resources/config/collectors.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<parameter key="data_collector.time.class">Symfony\Component\HttpKernel\DataCollector\TimeDataCollector</parameter>
1414
<parameter key="data_collector.memory.class">Symfony\Component\HttpKernel\DataCollector\MemoryDataCollector</parameter>
1515
<parameter key="data_collector.router.class">Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector</parameter>
16+
<parameter key="data_collector.form.class">Symfony\Component\Form\Extension\DataCollector\Collector\FormCollector</parameter>
1617
</parameters>
1718

1819
<services>
@@ -53,5 +54,10 @@
5354
<tag name="kernel.event_listener" event="kernel.controller" method="onKernelController"/>
5455
<tag name="data_collector" template="@WebProfiler/Collector/router.html.twig" id="router" priority="255" />
5556
</service>
57+
58+
<service id="data_collector.form" class="%data_collector.form.class%" >
59+
<tag name="data_collector" template="@WebProfiler/Collector/form.html.twig" id="form" priority="255" />
60+
</service>
61+
5662
</services>
5763
</container>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" ?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
6+
7+
<parameters>
8+
<parameter key="form.type_extension.form.data_collector.class">Symfony\Component\Form\Extension\DataCollector\Type\DataCollectorTypeExtension</parameter>
9+
<parameter key="form.type_extension.form.data_collector.event_subscriber.class">Symfony\Component\Form\Extension\DataCollector\EventListener\DataCollectorSubscriber</parameter>
10+
</parameters>
11+
12+
<services>
13+
<!-- DataCollectorExtension -->
14+
<service id="form.type_extension.form.data_collector" class="%form.type_extension.form.data_collector.class%">
15+
<tag name="form.type_extension" alias="form" />
16+
<argument type="service" id="form.type_extension.form.data_collector.event_subscriber" />
17+
</service>
18+
<service id="form.type_extension.form.data_collector.event_subscriber" class="%form.type_extension.form.data_collector.event_subscriber.class%" public="false">
19+
<argument type="service" id="data_collector.form" />
20+
</service>
21+
</services>
22+
</container>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
{% extends app.request.isXmlHttpRequest ? 'WebProfilerBundle:Profiler:ajax_layout.html.twig' : 'WebProfilerBundle:Profiler:layout.html.twig' %}
2+
3+
{% block toolbar %}
4+
{% if collector.dataCount %}
5+
{% set icon %}
6+
<img width="20" height="28" alt="Forms" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAbCAYAAAB836/YAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDNkE1RUQ2RjBFMzcxMUUzOEIyQkVBRkQ5QzNENTIxMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDNkE1RUQ3MDBFMzcxMUUzOEIyQkVBRkQ5QzNENTIxMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkM2QTVFRDZEMEUzNzExRTM4QjJCRUFGRDlDM0Q1MjEzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkM2QTVFRDZFMEUzNzExRTM4QjJCRUFGRDlDM0Q1MjEzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+fkaAkgAAAQtJREFUeNpi/P//PwM1ARMDlQGLg4MDgsPCAqb//PnDwMzMDGJ+//v3L4oGqDgnSBxZPdwMLJa4ggioQRzoklBxVySh3SguBOICGOffv38TgNQuIny2C6oeRDEim8Fob28PjxVgBIEk/zMyMhIVXqAIZYQo/o81UlhZWcGYWIBNLQta+PACKS1iDYSGJy9OA4Fe+EBKUsKWhlmwpMtZZCS/NHzJ5iFFCRuN7wXEEtQ0sJDirIfGrwBiLiL0HSbWwLPoWQkH2I0tu+KKlOVk+BSngclALEnNMHSldqTMJtOcCFwGNlDbhZ1Y1LwhwpwTuAz0waI4gxIXPqC2lzuoYeAPalajjIO+ogcIMAAaCkonoOPIhQAAAABJRU5ErkJggg=="/>
7+
<span class="sf-toolbar-status{% if collector.dataCount %} sf-toolbar-status-red{% endif %}">{{ collector.dataCount }}</span>
8+
{% endset %}
9+
10+
{% include 'WebProfilerBundle:Profiler:toolbar_item.html.twig' with { 'link': profiler_url } %}
11+
{% endif %}
12+
{% endblock %}
13+
14+
{% block menu %}
15+
<span class="label">
16+
<span class="icon"><img src="data:image/png;base64,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" alt=""/></span>
17+
<strong>Forms</strong>
18+
{% if collector.dataCount %}
19+
<span class="count"><span>{{ collector.dataCount }}</span></span>
20+
{% endif %}
21+
</span>
22+
{% endblock %}
23+
24+
{% block panel %}
25+
<h2>Invalid Forms</h2>
26+
27+
{% for formName, fields in collector.data %}
28+
<h3>{{ formName }}</h3>
29+
<table>
30+
<tr>
31+
<th>Field</th>
32+
<th>Type</th>
33+
<th>Value</th>
34+
<th>Messages</th>
35+
</tr>
36+
{% for fieldName, field in fields %}
37+
<tr>
38+
<td><b>{{ fieldName }}</b></td>
39+
<td>{{ field.type }}</td>
40+
<td>{{ field.value }}</td>
41+
<td>
42+
<ul>
43+
{% for errorMessage in field.errors %}
44+
<li>
45+
{{ errorMessage.message }}
46+
</li>
47+
{% endfor %}
48+
</ul>
49+
</td>
50+
</tr>
51+
{% endfor %}
52+
</table>
53+
{% else %}
54+
<em>No invalid form{% if collector.dataCount > 1 %}s{% endif %} detected for this request.</em>
55+
{% endfor %}
56+
{% endblock %}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Form\Extension\DataCollector\Collector;
13+
14+
use Symfony\Component\Form\FormInterface;
15+
use Symfony\Component\HttpFoundation\Request;
16+
use Symfony\Component\HttpFoundation\Response;
17+
use Symfony\Component\HttpKernel\DataCollector\DataCollector as BaseCollector;
18+
19+
/**
20+
* DataCollector for Form Validation Failures.
21+
*
22+
* @author Robert Schönthal <robert.schoenthal@gmail.com>
23+
*/
24+
class FormCollector extends BaseCollector
25+
{
26+
/**
27+
* {@inheritDoc}
28+
*/
29+
public function collect(Request $request, Response $response, \Exception $exception = null)
30+
{
31+
//nothing to do, everything is added with addError()
32+
}
33+
34+
/**
35+
* Adds a Form-Error to the Collector.
36+
*
37+
* @param FormInterface $form
38+
*/
39+
public function addError(FormInterface $form)
40+
{
41+
$storeData = array(
42+
'root' => $form->getRoot()->getName(),
43+
'name' => (string)$form->getPropertyPath(),
44+
'type' => $form->getConfig()->getType()->getName(),
45+
'errors' => $form->getErrors(),
46+
'value' => $this->varToString($form->getViewData())
47+
);
48+
49+
$this->data[$storeData['root']][$storeData['name']] = $storeData;
50+
}
51+
52+
/**
53+
* {@inheritDoc}
54+
*/
55+
public function getName()
56+
{
57+
return 'form';
58+
}
59+
60+
/**
61+
* Returns all collected Data.
62+
*
63+
* @return array
64+
*/
65+
public function getData()
66+
{
67+
return $this->data;
68+
}
69+
70+
/**
71+
* Returns the number of invalid Forms.
72+
*
73+
* @return integer
74+
*/
75+
public function getDataCount()
76+
{
77+
return count($this->data);
78+
}
79+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Form\Extension\DataCollector;
13+
14+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15+
use Symfony\Component\Form\AbstractExtension;
16+
17+
/**
18+
* DataCollectorExtension for collecting Form Validation Failures.
19+
*
20+
* @author Robert Schönthal <robert.schoenthal@gmail.com>
21+
*/
22+
class DataCollectorExtension extends AbstractExtension
23+
{
24+
/**
25+
* @var EventSubscriberInterface
26+
*/
27+
private $eventSubscriber;
28+
29+
public function __construct(EventSubscriberInterface $eventSubscriber)
30+
{
31+
$this->eventSubscriber = $eventSubscriber;
32+
}
33+
34+
/**
35+
* {@inheritDoc}
36+
*/
37+
protected function loadTypeExtensions()
38+
{
39+
return array(
40+
new Type\DataCollectorTypeExtension($this->eventSubscriber)
41+
);
42+
}
43+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Form\Extension\DataCollector\EventListener;
13+
14+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15+
use Symfony\Component\Form\Extension\DataCollector\Collector\FormCollector;
16+
use Symfony\Component\Form\FormEvent;
17+
use Symfony\Component\Form\FormEvents;
18+
use Symfony\Component\Form\FormInterface;
19+
20+
/**
21+
* EventSubscriber for adding Form Validation Failures to the DataCollector.
22+
*
23+
* @author Robert Schönthal <robert.schoenthal@gmail.com>
24+
*/
25+
class DataCollectorSubscriber implements EventSubscriberInterface
26+
{
27+
/**
28+
* @var FormCollector
29+
*/
30+
private $collector;
31+
32+
public function __construct(FormCollector $collector)
33+
{
34+
$this->collector = $collector;
35+
}
36+
37+
/**
38+
* {@inheritDoc}
39+
*/
40+
public static function getSubscribedEvents()
41+
{
42+
return array(FormEvents::POST_SUBMIT => array('addToProfiler', -255));
43+
}
44+
45+
/**
46+
* Searches for invalid Form-Data and adds them to the Collector.
47+
*
48+
* @param FormEvent $event The event object
49+
*/
50+
public function addToProfiler(FormEvent $event)
51+
{
52+
$form = $event->getForm();
53+
54+
if ($form->isRoot()) {
55+
$this->addErrors($form);
56+
}
57+
}
58+
59+
/**
60+
* Adds an invalid Form-Element to the Collector.
61+
*
62+
* @param FormInterface $form
63+
*/
64+
private function addErrors(FormInterface $form)
65+
{
66+
if ($form->getErrors()) {
67+
$this->collector->addError($form);
68+
}
69+
70+
//recursively add all child errors
71+
foreach ($form->all() as $field) {
72+
$this->addErrors($field);
73+
}
74+
}
75+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Form\Extension\DataCollector\Type;
13+
14+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15+
use Symfony\Component\Form\AbstractTypeExtension;
16+
use Symfony\Component\Form\FormBuilderInterface;
17+
18+
/**
19+
* DataCollector Type Extension for collecting invalid Forms.
20+
*
21+
* @author Robert Schönthal <robert.schoenthal@gmail.com>
22+
*/
23+
class DataCollectorTypeExtension extends AbstractTypeExtension
24+
{
25+
/**
26+
* @var EventSubscriberInterface
27+
*/
28+
private $eventSubscriber;
29+
30+
public function __construct(EventSubscriberInterface $eventSubscriber)
31+
{
32+
$this->eventSubscriber = $eventSubscriber;
33+
}
34+
35+
/**
36+
* {@inheritDoc}
37+
*/
38+
public function buildForm(FormBuilderInterface $builder, array $options)
39+
{
40+
$builder->addEventSubscriber($this->eventSubscriber);
41+
}
42+
43+
/**
44+
* {@inheritDoc}
45+
*/
46+
public function getExtendedType()
47+
{
48+
return 'form';
49+
}
50+
}

0 commit comments

Comments
 (0)