Ich habe ein Problem mit der Formularverwaltung in Silex.Optionen in Form in Silex injizieren
Ich habe ein Formular (RegionType
), mit dem ich meine Domain (Entitäten) Informationen ausfüllen und ändern kann (Beispiel, Informationen über eine Region
wie Name und Beschreibung). Dieses Formular erweitert AbstractType
von Symfony.
Ich versuche, eine Option (validation_groups
auf false) zu injizieren, um das Formular wiederzuverwenden, um Daten zu erhalten und diese Daten zu verwenden, um ein Suchformular in meiner DB zu erstellen.
Da das Formular für eine Suche und das Bearbeitungsformular dieselben Felder mit derselben Art von Daten verwenden, wollte ich meine Klassen nicht duplizieren.
Hier ist meine RegionType
Form:
<?php
namespace Easytrip2\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class RegionType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add ('name', 'text', array (
'label' => 'Region code'
));
$builder->add ('description', 'text', array (
'label' => 'Region description'
));
}
public function getName() {
return 'region';
}
public static function getScriptsIdsArray() {
return array (
array()
);
}
}
ich es für meine Suche nur durch Duplizieren und das Hinzufügen der folgenden Verfahren verwenden:
im Typpublic function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults (array (
'validation_groups' => false
));
}
Mein Controller für die Bearbeitung der Form Version (Standard Create Update Sache):
public function regionUpdateByIdAction($id, Request $request, Application $app) {
if (/*check the user rights*/) {
//find the object being updated
$obj = $app ['dao.region']->findById ($id);
//create form and handle request
$form = $app ['form.factory']->create (new RegionType ($app), $obj);
$form->handleRequest ($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($app ['dao.region']->save ($obj)) {
//warn user and redirect
$app ['session']->getFlashBag()->add ('success', 'The region was succesfully updated.');
return $app->redirect ($app ['url_generator']->generate ('region'));
} else {
$app ['session']->getFlashBag()->add ('error', 'Something went wrong...');
}
}
//generate the form view
return $app ['twig']->render ('form.html.twig', array (
'form' => $form->createView(),
'title' => 'Edit region'
));
} else {
$app ['session']->getFlashBag()->add ('error', 'Don\'t have the rights...');
return $app->redirect ($app ['url_generator']->generate ('home'));
}
}
Was? ich möchte ist, verwenden zu tun, die folgende Zeile
form = $app ['form.factory']->create (new RegionType ($app), $obj);
und eine Option darin hinzufügen, so dass eine Option übergeben, wie
$form = $app ['form.factory']->create (new RegionType ($app), $obj, array (
'validation_groups' => false
));
Wenn das Debuggen, ich finde, dass meine Wahl auf die Normalisierern wird nach unten und der validation_groups
Normalizer ändert es von false
zu einem leeren array
, Zeile 962 von OptionsResolver.php
, mit dem folgenden Stacktrace (kein Fehler auftritt, nur um den Call-Stack anzuzeigen).
C:/path/to/app/Easytrip2/vendor/symfony/options-resolver/OptionsResolver.php.Symfony\Component\OptionsResolver\OptionsResolver->offsetGet(): lineno 944
C:/path/to/app/Easytrip2/vendor/symfony/options-resolver/OptionsResolver.php.Symfony\Component\OptionsResolver\OptionsResolver->resolve(): lineno 791
C:/path/to/app/Easytrip2/vendor/symfony/form/ResolvedFormType.php.Symfony\Component\Form\ResolvedFormType->createBuilder(): lineno 104
C:/path/to/app/Easytrip2/vendor/symfony/form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.php.Symfony\Component\Form\Extension\DataCollector\Proxy\ResolvedTypeDataCollectorProxy->createBuilder(): lineno 83
C:/path/to/app/Easytrip2/vendor/symfony/form/FormFactory.php.Symfony\Component\Form\FormFactory->createNamedBuilder(): lineno 87
C:/path/to/app/Easytrip2/vendor/symfony/form/FormFactory.php.Symfony\Component\Form\FormFactory->createBuilder(): lineno 67
C:/path/to/app/Easytrip2/vendor/symfony/form/FormFactory.php.Symfony\Component\Form\FormFactory->create(): lineno 39
C:/path/to/app/Easytrip2/src/Controller/RegionController.php.Easytrip2\Controller\RegionController->regionSearchAction(): lineno 39
C:/path/to/app/Easytrip2/vendor/symfony/http-kernel/HttpKernel.php.call_user_func_array:{D:\users\F001780\Desktop\soft\wamp\www\Easytrip2\vendor\symfony\http-kernel\HttpKernel.php:139}(): lineno 139
C:/path/to/app/Easytrip2/vendor/symfony/http-kernel/HttpKernel.php.Symfony\Component\HttpKernel\HttpKernel->handleRaw(): lineno 139
C:/path/to/app/Easytrip2/vendor/symfony/http-kernel/HttpKernel.php.Symfony\Component\HttpKernel\HttpKernel->handle(): lineno 62
C:/path/to/app/Easytrip2/vendor/silex/silex/src/Silex/Application.php.Silex\Application->handle(): lineno 586
C:/path/to/app/Easytrip2/vendor/silex/silex/src/Silex/Application.php.Silex\Application->run(): lineno 563
C:/path/to/app/Easytrip2/web/index.php.{main}(): lineno 10
Kann jemand dieses Verhalten erklären? Ich bin in den mecanics leicht hier verloren ...
ich meine composer.json Einstellungen vergessen:
{
"require": {
"silex/silex": "~1.3",
"doctrine/dbal": "2.5.*",
"symfony/security": "2.7.*",
"twig/twig": "1.21.*",
"symfony/twig-bridge": "2.7.*",
"symfony/form": "2.7.*",
"symfony/translation": "2.7.*",
"symfony/config": "2.7.*",
"jasongrimes/silex-simpleuser": "*",
"twig/extensions": "1.3.*",
"symfony/validator": "2.*",
"phpoffice/phpexcel": "1.*",
"symfony/monolog-bridge": "*",
"box/spout": "*"
},
"require-dev": {
"phpunit/phpunit": "*",
"symfony/browser-kit": "*",
"symfony/css-selector": "*",
"silex/web-profiler": "*"
},
"autoload":{
"psr-4":{"Easytrip2\\": "src"}
},
"autoload-dev":{
"psr-4":{"Easytrip2\\": "tests"}
}
}
Normalizer für validation_groups ändert 'false' in leeres Array. Sie können sehen, wie es in 'Symfony \ Component \ Form \ Extension \ Validator \ Type \ BaseValidatorExtension' funktioniert –
Sie können' validation_groups' auf null setzen, es ist der Standardwert –
Beide von euch haben Recht, und ich brauchte Zeit, um das zu erkennen leeres Array wird als falsch ausgewertet. Aber dann kann ich nicht verstehen, was dieses Verhalten ändert und warum die Validierung stattfindet ... –