私はSilexのフォーム管理に関する問題に直面しています。Silexのフォームにオプションを挿入する
ドメイン(エンティティ)情報(例:Region
の名前と説明のような情報)を入力して変更できるフォーム(RegionType
)があります。このフォームはSymfonyからAbstractType
まで拡張されています。
フォームを再利用してデータを取得し、このデータを使用してmy DBの検索フォームを作成できるようにするには、オプション(validation_groups
をfalseにする)を注入しようとしています。
検索フォームと編集フォームで同じ種類のデータを持つ同じフィールドが使用されるため、クラスを複製したくありませんでした。ここで
は私RegionType
形式です:
<?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()
);
}
}
私はちょうどそれを複製し、次のメソッドを追加することによって、私の検索のためにそれを使用することができます。
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults (array (
'validation_groups' => false
));
}
タイプでフォームを編集するための私のコントローラバージョン(標準アップデート作成):
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'));
}
}
私がやりたいデバッグするとき、私は私のオプションは、正規化に降りていることを見つける
$form = $app ['form.factory']->create (new RegionType ($app), $obj, array (
'validation_groups' => false
));
のように、
form = $app ['form.factory']->create (new RegionType ($app), $obj);
に
次の行を使用して、オプションを通過させることでオプションを追加することですvalidation_groups
ノーマライザでは、
false
から
array
、の962行を次のstacktrace(呼び出しスタックを表示するだけでエラーは発生しません)に変更します。
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
誰でもこの現象を説明できますか?私が見つけた、...
{
"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"}
}
}
validation_groupsのノーマライザは空の配列に 'false'を変更します。あなたは 'Symfony \ Component \ Form \ Extension \ Validension \ Type \ BaseValidatorExtension'でどのようにwokrksを見ることができます –
' validation_groups'をヌルにすることができます。デフォルト値は –
です。空の配列はfalseと評価されます。しかし、私はこの振る舞いを変え、検証が行われる理由を理解することはできません。 –