login consent app sql
This commit is contained in:
40
vendor/symfony/form/Extension/DataCollector/DataCollectorExtension.php
vendored
Normal file
40
vendor/symfony/form/Extension/DataCollector/DataCollectorExtension.php
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
<?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\Component\Form\Extension\DataCollector;
|
||||
|
||||
use Symfony\Component\Form\AbstractExtension;
|
||||
|
||||
/**
|
||||
* Extension for collecting data of the forms on a page.
|
||||
*
|
||||
* @author Robert Schönthal <robert.schoenthal@gmail.com>
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
class DataCollectorExtension extends AbstractExtension
|
||||
{
|
||||
private $dataCollector;
|
||||
|
||||
public function __construct(FormDataCollectorInterface $dataCollector)
|
||||
{
|
||||
$this->dataCollector = $dataCollector;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function loadTypeExtensions()
|
||||
{
|
||||
return [
|
||||
new Type\DataCollectorTypeExtension($this->dataCollector),
|
||||
];
|
||||
}
|
||||
}
|
75
vendor/symfony/form/Extension/DataCollector/EventListener/DataCollectorListener.php
vendored
Normal file
75
vendor/symfony/form/Extension/DataCollector/EventListener/DataCollectorListener.php
vendored
Normal file
@ -0,0 +1,75 @@
|
||||
<?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\Component\Form\Extension\DataCollector\EventListener;
|
||||
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
use Symfony\Component\Form\Extension\DataCollector\FormDataCollectorInterface;
|
||||
use Symfony\Component\Form\FormEvent;
|
||||
use Symfony\Component\Form\FormEvents;
|
||||
|
||||
/**
|
||||
* Listener that invokes a data collector for the {@link FormEvents::POST_SET_DATA}
|
||||
* and {@link FormEvents::POST_SUBMIT} events.
|
||||
*
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
class DataCollectorListener implements EventSubscriberInterface
|
||||
{
|
||||
private $dataCollector;
|
||||
|
||||
public function __construct(FormDataCollectorInterface $dataCollector)
|
||||
{
|
||||
$this->dataCollector = $dataCollector;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function getSubscribedEvents()
|
||||
{
|
||||
return [
|
||||
// High priority in order to be called as soon as possible
|
||||
FormEvents::POST_SET_DATA => ['postSetData', 255],
|
||||
// Low priority in order to be called as late as possible
|
||||
FormEvents::POST_SUBMIT => ['postSubmit', -255],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Listener for the {@link FormEvents::POST_SET_DATA} event.
|
||||
*/
|
||||
public function postSetData(FormEvent $event)
|
||||
{
|
||||
if ($event->getForm()->isRoot()) {
|
||||
// Collect basic information about each form
|
||||
$this->dataCollector->collectConfiguration($event->getForm());
|
||||
|
||||
// Collect the default data
|
||||
$this->dataCollector->collectDefaultData($event->getForm());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Listener for the {@link FormEvents::POST_SUBMIT} event.
|
||||
*/
|
||||
public function postSubmit(FormEvent $event)
|
||||
{
|
||||
if ($event->getForm()->isRoot()) {
|
||||
// Collect the submitted data of each form
|
||||
$this->dataCollector->collectSubmittedData($event->getForm());
|
||||
|
||||
// Assemble a form tree
|
||||
// This is done again after the view is built, but we need it here as the view is not always created.
|
||||
$this->dataCollector->buildPreliminaryFormTree($event->getForm());
|
||||
}
|
||||
}
|
||||
}
|
343
vendor/symfony/form/Extension/DataCollector/FormDataCollector.php
vendored
Normal file
343
vendor/symfony/form/Extension/DataCollector/FormDataCollector.php
vendored
Normal file
@ -0,0 +1,343 @@
|
||||
<?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\Component\Form\Extension\DataCollector;
|
||||
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
use Symfony\Component\Form\FormView;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpKernel\DataCollector\DataCollector;
|
||||
use Symfony\Component\Validator\ConstraintViolationInterface;
|
||||
use Symfony\Component\VarDumper\Caster\Caster;
|
||||
use Symfony\Component\VarDumper\Caster\ClassStub;
|
||||
use Symfony\Component\VarDumper\Caster\StubCaster;
|
||||
use Symfony\Component\VarDumper\Cloner\Stub;
|
||||
|
||||
/**
|
||||
* Data collector for {@link FormInterface} instances.
|
||||
*
|
||||
* @author Robert Schönthal <robert.schoenthal@gmail.com>
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*
|
||||
* @final
|
||||
*/
|
||||
class FormDataCollector extends DataCollector implements FormDataCollectorInterface
|
||||
{
|
||||
private $dataExtractor;
|
||||
|
||||
/**
|
||||
* Stores the collected data per {@link FormInterface} instance.
|
||||
*
|
||||
* Uses the hashes of the forms as keys. This is preferable over using
|
||||
* {@link \SplObjectStorage}, because in this way no references are kept
|
||||
* to the {@link FormInterface} instances.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $dataByForm;
|
||||
|
||||
/**
|
||||
* Stores the collected data per {@link FormView} instance.
|
||||
*
|
||||
* Uses the hashes of the views as keys. This is preferable over using
|
||||
* {@link \SplObjectStorage}, because in this way no references are kept
|
||||
* to the {@link FormView} instances.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $dataByView;
|
||||
|
||||
/**
|
||||
* Connects {@link FormView} with {@link FormInterface} instances.
|
||||
*
|
||||
* Uses the hashes of the views as keys and the hashes of the forms as
|
||||
* values. This is preferable over storing the objects directly, because
|
||||
* this way they can safely be discarded by the GC.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $formsByView;
|
||||
|
||||
public function __construct(FormDataExtractorInterface $dataExtractor)
|
||||
{
|
||||
if (!class_exists(ClassStub::class)) {
|
||||
throw new \LogicException(sprintf('The VarDumper component is needed for using the "%s" class. Install symfony/var-dumper version 3.4 or above.', __CLASS__));
|
||||
}
|
||||
|
||||
$this->dataExtractor = $dataExtractor;
|
||||
|
||||
$this->reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Does nothing. The data is collected during the form event listeners.
|
||||
*/
|
||||
public function collect(Request $request, Response $response, \Throwable $exception = null)
|
||||
{
|
||||
}
|
||||
|
||||
public function reset()
|
||||
{
|
||||
$this->data = [
|
||||
'forms' => [],
|
||||
'forms_by_hash' => [],
|
||||
'nb_errors' => 0,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function associateFormWithView(FormInterface $form, FormView $view)
|
||||
{
|
||||
$this->formsByView[spl_object_hash($view)] = spl_object_hash($form);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function collectConfiguration(FormInterface $form)
|
||||
{
|
||||
$hash = spl_object_hash($form);
|
||||
|
||||
if (!isset($this->dataByForm[$hash])) {
|
||||
$this->dataByForm[$hash] = [];
|
||||
}
|
||||
|
||||
$this->dataByForm[$hash] = array_replace(
|
||||
$this->dataByForm[$hash],
|
||||
$this->dataExtractor->extractConfiguration($form)
|
||||
);
|
||||
|
||||
foreach ($form as $child) {
|
||||
$this->collectConfiguration($child);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function collectDefaultData(FormInterface $form)
|
||||
{
|
||||
$hash = spl_object_hash($form);
|
||||
|
||||
if (!isset($this->dataByForm[$hash])) {
|
||||
// field was created by form event
|
||||
$this->collectConfiguration($form);
|
||||
}
|
||||
|
||||
$this->dataByForm[$hash] = array_replace(
|
||||
$this->dataByForm[$hash],
|
||||
$this->dataExtractor->extractDefaultData($form)
|
||||
);
|
||||
|
||||
foreach ($form as $child) {
|
||||
$this->collectDefaultData($child);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function collectSubmittedData(FormInterface $form)
|
||||
{
|
||||
$hash = spl_object_hash($form);
|
||||
|
||||
if (!isset($this->dataByForm[$hash])) {
|
||||
// field was created by form event
|
||||
$this->collectConfiguration($form);
|
||||
$this->collectDefaultData($form);
|
||||
}
|
||||
|
||||
$this->dataByForm[$hash] = array_replace(
|
||||
$this->dataByForm[$hash],
|
||||
$this->dataExtractor->extractSubmittedData($form)
|
||||
);
|
||||
|
||||
// Count errors
|
||||
if (isset($this->dataByForm[$hash]['errors'])) {
|
||||
$this->data['nb_errors'] += \count($this->dataByForm[$hash]['errors']);
|
||||
}
|
||||
|
||||
foreach ($form as $child) {
|
||||
$this->collectSubmittedData($child);
|
||||
|
||||
// Expand current form if there are children with errors
|
||||
if (empty($this->dataByForm[$hash]['has_children_error'])) {
|
||||
$childData = $this->dataByForm[spl_object_hash($child)];
|
||||
$this->dataByForm[$hash]['has_children_error'] = !empty($childData['has_children_error']) || !empty($childData['errors']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function collectViewVariables(FormView $view)
|
||||
{
|
||||
$hash = spl_object_hash($view);
|
||||
|
||||
if (!isset($this->dataByView[$hash])) {
|
||||
$this->dataByView[$hash] = [];
|
||||
}
|
||||
|
||||
$this->dataByView[$hash] = array_replace(
|
||||
$this->dataByView[$hash],
|
||||
$this->dataExtractor->extractViewVariables($view)
|
||||
);
|
||||
|
||||
foreach ($view->children as $child) {
|
||||
$this->collectViewVariables($child);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildPreliminaryFormTree(FormInterface $form)
|
||||
{
|
||||
$this->data['forms'][$form->getName()] = &$this->recursiveBuildPreliminaryFormTree($form, $this->data['forms_by_hash']);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildFinalFormTree(FormInterface $form, FormView $view)
|
||||
{
|
||||
$this->data['forms'][$form->getName()] = &$this->recursiveBuildFinalFormTree($form, $view, $this->data['forms_by_hash']);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName(): string
|
||||
{
|
||||
return 'form';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getData()
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
public function __sleep(): array
|
||||
{
|
||||
foreach ($this->data['forms_by_hash'] as &$form) {
|
||||
if (isset($form['type_class']) && !$form['type_class'] instanceof ClassStub) {
|
||||
$form['type_class'] = new ClassStub($form['type_class']);
|
||||
}
|
||||
}
|
||||
|
||||
$this->data = $this->cloneVar($this->data);
|
||||
|
||||
return parent::__sleep();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getCasters(): array
|
||||
{
|
||||
return parent::getCasters() + [
|
||||
\Exception::class => function (\Exception $e, array $a, Stub $s) {
|
||||
foreach (["\0Exception\0previous", "\0Exception\0trace"] as $k) {
|
||||
if (isset($a[$k])) {
|
||||
unset($a[$k]);
|
||||
++$s->cut;
|
||||
}
|
||||
}
|
||||
|
||||
return $a;
|
||||
},
|
||||
FormInterface::class => function (FormInterface $f, array $a) {
|
||||
return [
|
||||
Caster::PREFIX_VIRTUAL.'name' => $f->getName(),
|
||||
Caster::PREFIX_VIRTUAL.'type_class' => new ClassStub(\get_class($f->getConfig()->getType()->getInnerType())),
|
||||
];
|
||||
},
|
||||
FormView::class => [StubCaster::class, 'cutInternals'],
|
||||
ConstraintViolationInterface::class => function (ConstraintViolationInterface $v, array $a) {
|
||||
return [
|
||||
Caster::PREFIX_VIRTUAL.'root' => $v->getRoot(),
|
||||
Caster::PREFIX_VIRTUAL.'path' => $v->getPropertyPath(),
|
||||
Caster::PREFIX_VIRTUAL.'value' => $v->getInvalidValue(),
|
||||
];
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
private function &recursiveBuildPreliminaryFormTree(FormInterface $form, array &$outputByHash)
|
||||
{
|
||||
$hash = spl_object_hash($form);
|
||||
|
||||
$output = &$outputByHash[$hash];
|
||||
$output = $this->dataByForm[$hash]
|
||||
?? [];
|
||||
|
||||
$output['children'] = [];
|
||||
|
||||
foreach ($form as $name => $child) {
|
||||
$output['children'][$name] = &$this->recursiveBuildPreliminaryFormTree($child, $outputByHash);
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
private function &recursiveBuildFinalFormTree(FormInterface $form = null, FormView $view, array &$outputByHash)
|
||||
{
|
||||
$viewHash = spl_object_hash($view);
|
||||
$formHash = null;
|
||||
|
||||
if (null !== $form) {
|
||||
$formHash = spl_object_hash($form);
|
||||
} elseif (isset($this->formsByView[$viewHash])) {
|
||||
// The FormInterface instance of the CSRF token is never contained in
|
||||
// the FormInterface tree of the form, so we need to get the
|
||||
// corresponding FormInterface instance for its view in a different way
|
||||
$formHash = $this->formsByView[$viewHash];
|
||||
}
|
||||
if (null !== $formHash) {
|
||||
$output = &$outputByHash[$formHash];
|
||||
}
|
||||
|
||||
$output = $this->dataByView[$viewHash]
|
||||
?? [];
|
||||
|
||||
if (null !== $formHash) {
|
||||
$output = array_replace(
|
||||
$output,
|
||||
$this->dataByForm[$formHash]
|
||||
?? []
|
||||
);
|
||||
}
|
||||
|
||||
$output['children'] = [];
|
||||
|
||||
foreach ($view->children as $name => $childView) {
|
||||
// The CSRF token, for example, is never added to the form tree.
|
||||
// It is only present in the view.
|
||||
$childForm = null !== $form && $form->has($name)
|
||||
? $form->get($name)
|
||||
: null;
|
||||
|
||||
$output['children'][$name] = &$this->recursiveBuildFinalFormTree($childForm, $childView, $outputByHash);
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
85
vendor/symfony/form/Extension/DataCollector/FormDataCollectorInterface.php
vendored
Normal file
85
vendor/symfony/form/Extension/DataCollector/FormDataCollectorInterface.php
vendored
Normal file
@ -0,0 +1,85 @@
|
||||
<?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\Component\Form\Extension\DataCollector;
|
||||
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
use Symfony\Component\Form\FormView;
|
||||
use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;
|
||||
use Symfony\Component\VarDumper\Cloner\Data;
|
||||
|
||||
/**
|
||||
* Collects and structures information about forms.
|
||||
*
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
interface FormDataCollectorInterface extends DataCollectorInterface
|
||||
{
|
||||
/**
|
||||
* Stores configuration data of the given form and its children.
|
||||
*/
|
||||
public function collectConfiguration(FormInterface $form);
|
||||
|
||||
/**
|
||||
* Stores the default data of the given form and its children.
|
||||
*/
|
||||
public function collectDefaultData(FormInterface $form);
|
||||
|
||||
/**
|
||||
* Stores the submitted data of the given form and its children.
|
||||
*/
|
||||
public function collectSubmittedData(FormInterface $form);
|
||||
|
||||
/**
|
||||
* Stores the view variables of the given form view and its children.
|
||||
*/
|
||||
public function collectViewVariables(FormView $view);
|
||||
|
||||
/**
|
||||
* Specifies that the given objects represent the same conceptual form.
|
||||
*/
|
||||
public function associateFormWithView(FormInterface $form, FormView $view);
|
||||
|
||||
/**
|
||||
* Assembles the data collected about the given form and its children as
|
||||
* a tree-like data structure.
|
||||
*
|
||||
* The result can be queried using {@link getData()}.
|
||||
*/
|
||||
public function buildPreliminaryFormTree(FormInterface $form);
|
||||
|
||||
/**
|
||||
* Assembles the data collected about the given form and its children as
|
||||
* a tree-like data structure.
|
||||
*
|
||||
* The result can be queried using {@link getData()}.
|
||||
*
|
||||
* Contrary to {@link buildPreliminaryFormTree()}, a {@link FormView}
|
||||
* object has to be passed. The tree structure of this view object will be
|
||||
* used for structuring the resulting data. That means, if a child is
|
||||
* present in the view, but not in the form, it will be present in the final
|
||||
* data array anyway.
|
||||
*
|
||||
* When {@link FormView} instances are present in the view tree, for which
|
||||
* no corresponding {@link FormInterface} objects can be found in the form
|
||||
* tree, only the view data will be included in the result. If a
|
||||
* corresponding {@link FormInterface} exists otherwise, call
|
||||
* {@link associateFormWithView()} before calling this method.
|
||||
*/
|
||||
public function buildFinalFormTree(FormInterface $form, FormView $view);
|
||||
|
||||
/**
|
||||
* Returns all collected data.
|
||||
*
|
||||
* @return array|Data
|
||||
*/
|
||||
public function getData();
|
||||
}
|
168
vendor/symfony/form/Extension/DataCollector/FormDataExtractor.php
vendored
Normal file
168
vendor/symfony/form/Extension/DataCollector/FormDataExtractor.php
vendored
Normal file
@ -0,0 +1,168 @@
|
||||
<?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\Component\Form\Extension\DataCollector;
|
||||
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
use Symfony\Component\Form\FormView;
|
||||
use Symfony\Component\Validator\ConstraintViolationInterface;
|
||||
|
||||
/**
|
||||
* Default implementation of {@link FormDataExtractorInterface}.
|
||||
*
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
class FormDataExtractor implements FormDataExtractorInterface
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function extractConfiguration(FormInterface $form)
|
||||
{
|
||||
$data = [
|
||||
'id' => $this->buildId($form),
|
||||
'name' => $form->getName(),
|
||||
'type_class' => \get_class($form->getConfig()->getType()->getInnerType()),
|
||||
'synchronized' => $form->isSynchronized(),
|
||||
'passed_options' => [],
|
||||
'resolved_options' => [],
|
||||
];
|
||||
|
||||
foreach ($form->getConfig()->getAttribute('data_collector/passed_options', []) as $option => $value) {
|
||||
$data['passed_options'][$option] = $value;
|
||||
}
|
||||
|
||||
foreach ($form->getConfig()->getOptions() as $option => $value) {
|
||||
$data['resolved_options'][$option] = $value;
|
||||
}
|
||||
|
||||
ksort($data['passed_options']);
|
||||
ksort($data['resolved_options']);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function extractDefaultData(FormInterface $form)
|
||||
{
|
||||
$data = [
|
||||
'default_data' => [
|
||||
'norm' => $form->getNormData(),
|
||||
],
|
||||
'submitted_data' => [],
|
||||
];
|
||||
|
||||
if ($form->getData() !== $form->getNormData()) {
|
||||
$data['default_data']['model'] = $form->getData();
|
||||
}
|
||||
|
||||
if ($form->getViewData() !== $form->getNormData()) {
|
||||
$data['default_data']['view'] = $form->getViewData();
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function extractSubmittedData(FormInterface $form)
|
||||
{
|
||||
$data = [
|
||||
'submitted_data' => [
|
||||
'norm' => $form->getNormData(),
|
||||
],
|
||||
'errors' => [],
|
||||
];
|
||||
|
||||
if ($form->getViewData() !== $form->getNormData()) {
|
||||
$data['submitted_data']['view'] = $form->getViewData();
|
||||
}
|
||||
|
||||
if ($form->getData() !== $form->getNormData()) {
|
||||
$data['submitted_data']['model'] = $form->getData();
|
||||
}
|
||||
|
||||
foreach ($form->getErrors() as $error) {
|
||||
$errorData = [
|
||||
'message' => $error->getMessage(),
|
||||
'origin' => \is_object($error->getOrigin())
|
||||
? spl_object_hash($error->getOrigin())
|
||||
: null,
|
||||
'trace' => [],
|
||||
];
|
||||
|
||||
$cause = $error->getCause();
|
||||
|
||||
while (null !== $cause) {
|
||||
if ($cause instanceof ConstraintViolationInterface) {
|
||||
$errorData['trace'][] = $cause;
|
||||
$cause = method_exists($cause, 'getCause') ? $cause->getCause() : null;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($cause instanceof \Exception) {
|
||||
$errorData['trace'][] = $cause;
|
||||
$cause = $cause->getPrevious();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$errorData['trace'][] = $cause;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
$data['errors'][] = $errorData;
|
||||
}
|
||||
|
||||
$data['synchronized'] = $form->isSynchronized();
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function extractViewVariables(FormView $view)
|
||||
{
|
||||
$data = [
|
||||
'id' => $view->vars['id'] ?? null,
|
||||
'name' => $view->vars['name'] ?? null,
|
||||
'view_vars' => [],
|
||||
];
|
||||
|
||||
foreach ($view->vars as $varName => $value) {
|
||||
$data['view_vars'][$varName] = $value;
|
||||
}
|
||||
|
||||
ksort($data['view_vars']);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively builds an HTML ID for a form.
|
||||
*/
|
||||
private function buildId(FormInterface $form): string
|
||||
{
|
||||
$id = $form->getName();
|
||||
|
||||
if (null !== $form->getParent()) {
|
||||
$id = $this->buildId($form->getParent()).'_'.$id;
|
||||
}
|
||||
|
||||
return $id;
|
||||
}
|
||||
}
|
51
vendor/symfony/form/Extension/DataCollector/FormDataExtractorInterface.php
vendored
Normal file
51
vendor/symfony/form/Extension/DataCollector/FormDataExtractorInterface.php
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
<?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\Component\Form\Extension\DataCollector;
|
||||
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
use Symfony\Component\Form\FormView;
|
||||
|
||||
/**
|
||||
* Extracts arrays of information out of forms.
|
||||
*
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
interface FormDataExtractorInterface
|
||||
{
|
||||
/**
|
||||
* Extracts the configuration data of a form.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function extractConfiguration(FormInterface $form);
|
||||
|
||||
/**
|
||||
* Extracts the default data of a form.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function extractDefaultData(FormInterface $form);
|
||||
|
||||
/**
|
||||
* Extracts the submitted data of a form.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function extractSubmittedData(FormInterface $form);
|
||||
|
||||
/**
|
||||
* Extracts the view variables of a form.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function extractViewVariables(FormView $view);
|
||||
}
|
140
vendor/symfony/form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.php
vendored
Normal file
140
vendor/symfony/form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.php
vendored
Normal file
@ -0,0 +1,140 @@
|
||||
<?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\Component\Form\Extension\DataCollector\Proxy;
|
||||
|
||||
use Symfony\Component\Form\Extension\DataCollector\FormDataCollectorInterface;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\Form\FormFactoryInterface;
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
use Symfony\Component\Form\FormView;
|
||||
use Symfony\Component\Form\ResolvedFormTypeInterface;
|
||||
|
||||
/**
|
||||
* Proxy that invokes a data collector when creating a form and its view.
|
||||
*
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
class ResolvedTypeDataCollectorProxy implements ResolvedFormTypeInterface
|
||||
{
|
||||
private $proxiedType;
|
||||
private $dataCollector;
|
||||
|
||||
public function __construct(ResolvedFormTypeInterface $proxiedType, FormDataCollectorInterface $dataCollector)
|
||||
{
|
||||
$this->proxiedType = $proxiedType;
|
||||
$this->dataCollector = $dataCollector;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getBlockPrefix()
|
||||
{
|
||||
return $this->proxiedType->getBlockPrefix();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getParent()
|
||||
{
|
||||
return $this->proxiedType->getParent();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getInnerType()
|
||||
{
|
||||
return $this->proxiedType->getInnerType();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getTypeExtensions()
|
||||
{
|
||||
return $this->proxiedType->getTypeExtensions();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function createBuilder(FormFactoryInterface $factory, string $name, array $options = [])
|
||||
{
|
||||
$builder = $this->proxiedType->createBuilder($factory, $name, $options);
|
||||
|
||||
$builder->setAttribute('data_collector/passed_options', $options);
|
||||
$builder->setType($this);
|
||||
|
||||
return $builder;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function createView(FormInterface $form, FormView $parent = null)
|
||||
{
|
||||
return $this->proxiedType->createView($form, $parent);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$this->proxiedType->buildForm($builder, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildView(FormView $view, FormInterface $form, array $options)
|
||||
{
|
||||
$this->proxiedType->buildView($view, $form, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function finishView(FormView $view, FormInterface $form, array $options)
|
||||
{
|
||||
$this->proxiedType->finishView($view, $form, $options);
|
||||
|
||||
// Remember which view belongs to which form instance, so that we can
|
||||
// get the collected data for a view when its form instance is not
|
||||
// available (e.g. CSRF token)
|
||||
$this->dataCollector->associateFormWithView($form, $view);
|
||||
|
||||
// Since the CSRF token is only present in the FormView tree, we also
|
||||
// need to check the FormView tree instead of calling isRoot() on the
|
||||
// FormInterface tree
|
||||
if (null === $view->parent) {
|
||||
$this->dataCollector->collectViewVariables($view);
|
||||
|
||||
// Re-assemble data, in case FormView instances were added, for
|
||||
// which no FormInterface instances were present (e.g. CSRF token).
|
||||
// Since finishView() is called after finishing the views of all
|
||||
// children, we can safely assume that information has been
|
||||
// collected about the complete form tree.
|
||||
$this->dataCollector->buildFinalFormTree($form, $view);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getOptionsResolver()
|
||||
{
|
||||
return $this->proxiedType->getOptionsResolver();
|
||||
}
|
||||
}
|
46
vendor/symfony/form/Extension/DataCollector/Proxy/ResolvedTypeFactoryDataCollectorProxy.php
vendored
Normal file
46
vendor/symfony/form/Extension/DataCollector/Proxy/ResolvedTypeFactoryDataCollectorProxy.php
vendored
Normal file
@ -0,0 +1,46 @@
|
||||
<?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\Component\Form\Extension\DataCollector\Proxy;
|
||||
|
||||
use Symfony\Component\Form\Extension\DataCollector\FormDataCollectorInterface;
|
||||
use Symfony\Component\Form\FormTypeInterface;
|
||||
use Symfony\Component\Form\ResolvedFormTypeFactoryInterface;
|
||||
use Symfony\Component\Form\ResolvedFormTypeInterface;
|
||||
|
||||
/**
|
||||
* Proxy that wraps resolved types into {@link ResolvedTypeDataCollectorProxy}
|
||||
* instances.
|
||||
*
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
class ResolvedTypeFactoryDataCollectorProxy implements ResolvedFormTypeFactoryInterface
|
||||
{
|
||||
private $proxiedFactory;
|
||||
private $dataCollector;
|
||||
|
||||
public function __construct(ResolvedFormTypeFactoryInterface $proxiedFactory, FormDataCollectorInterface $dataCollector)
|
||||
{
|
||||
$this->proxiedFactory = $proxiedFactory;
|
||||
$this->dataCollector = $dataCollector;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function createResolvedType(FormTypeInterface $type, array $typeExtensions, ResolvedFormTypeInterface $parent = null)
|
||||
{
|
||||
return new ResolvedTypeDataCollectorProxy(
|
||||
$this->proxiedFactory->createResolvedType($type, $typeExtensions, $parent),
|
||||
$this->dataCollector
|
||||
);
|
||||
}
|
||||
}
|
53
vendor/symfony/form/Extension/DataCollector/Type/DataCollectorTypeExtension.php
vendored
Normal file
53
vendor/symfony/form/Extension/DataCollector/Type/DataCollectorTypeExtension.php
vendored
Normal file
@ -0,0 +1,53 @@
|
||||
<?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\Component\Form\Extension\DataCollector\Type;
|
||||
|
||||
use Symfony\Component\Form\AbstractTypeExtension;
|
||||
use Symfony\Component\Form\Extension\Core\Type\FormType;
|
||||
use Symfony\Component\Form\Extension\DataCollector\EventListener\DataCollectorListener;
|
||||
use Symfony\Component\Form\Extension\DataCollector\FormDataCollectorInterface;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
|
||||
/**
|
||||
* Type extension for collecting data of a form with this type.
|
||||
*
|
||||
* @author Robert Schönthal <robert.schoenthal@gmail.com>
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
class DataCollectorTypeExtension extends AbstractTypeExtension
|
||||
{
|
||||
/**
|
||||
* @var DataCollectorListener
|
||||
*/
|
||||
private $listener;
|
||||
|
||||
public function __construct(FormDataCollectorInterface $dataCollector)
|
||||
{
|
||||
$this->listener = new DataCollectorListener($dataCollector);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$builder->addEventSubscriber($this->listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function getExtendedTypes(): iterable
|
||||
{
|
||||
return [FormType::class];
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user