SymfonyのFormTypeを汎用化する
はじめに
Symfonyにおいてデータのあり方の定義として大きく
EntityとFormTypeがあります。
EntityとFormTypeがあります。
今回はデータを作成したり変更したりする際に
常に同じ規則性でチェックをするというものです。
※ 既存の仕組みの多くが同じデータに対して複数の定義があった
登録/編集・検索を同じFormTypeで管理
検索は基本的にデータの保存には関与しないので
validationをさせないという仕組みにする。(必要に応じてvalidationするかは項目ごとに制御可)
また必須項目としないようにする。
validationをさせないという仕組みにする。(必要に応じてvalidationするかは項目ごとに制御可)
また必須項目としないようにする。
例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public function buildForm(FormBuilder $builder, array $options) { $_tag = $this->tagType; $required = (in_array($_tag, array(self::TAG_SEARCH, self::TAG_BULKEDIT)) ? false : true); $emptyValue = (in_array($_tag, array(self::TAG_SEARCH, self::TAG_BULKEDIT)) ? '' : false); $builder // FormTypeの呼び出し元 ->add('tag', HiddenType::class, array( 'mapped' => false, 'data' => $_tag, )) ->add('name', TextType::class, array( 'label' => "entity.entity_name.name", 'attr' => array( 'class' => 'title', ), 'required' => $required,// 呼び出し元によって必須かどうかを変化させる )) // 中略 $builder ->addEventListener(\Symfony\Component\Form\FormEvents::POST_SUBMIT, function($event) { $form = $event->getForm(); $data = $form->getData(); if ($form['tag']->getData() != self::TAG_SEARCH) { // 検索時以外はデータの整合性をチェックする } }); |
その他 csvでの登録時も共通のフォーマットにする
csvの時は内部的にデータを揃えて作成するため
実際のHTMLのフォームでないことを考慮してCSRFトークンを生成してあげます。
実際のHTMLのフォームでないことを考慮してCSRFトークンを生成してあげます。
例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | $csvType = new SampleType(); $csvForm = $this->createForm(new CsvType()); foreach ($lines as $line) { $params['_token'] = $csrf->generateCsrfToken($csvForm->getName()); $params['name'] = $line[1];// nameというフィールドが2列目とする $params['value'] = $line[2];// valueというフィールドが3列目とする // 中略。その他フィールドがあれば足してゆく $csvForm->bind($params);// 共通のデータとしてデータインスタンスが生成される if (!$csvForm->isValid()) { // FormTypeに記述されたルールに違反した場合のエラー処理 } else { array_push($allData, $csvForm->getData());// FormTypeと関連付けされたデータ・タイプに置換して一時保持 } } if (count($allData) > 0) { // データの整合性が取れたものだけ保存 foreach ($allData as $entity) { $entityManager->persist($entity); } $entityManager->flush();// 保存 } |
Author Profile
スターフィールド編集部
SHARE