Сопоставление встроенных вложенных документов MongoDB с формой Symfony

#mongodb #symfony #doctrine #odm

#mongodb #symfony #доктрина #odm

Вопрос:

Я пытаюсь создать форму, которая будет заполнять базу данных Mongo. Для достижения этой цели я использую фреймворк Symfony и Doctrine ODM. И вот в чем моя проблема :

Я бы хотел, чтобы FormBuilderInterface генерировал 3 поля формы, такие как :

 <form>
    <input name="names[name]" />
    <input name="names[lastname]" />
    <input name="names[nickname]" />
</form>
 

И когда пользователь отправляет форму, документ в базе данных может выглядеть следующим образом :

 "names": {
     "name": "James",
     "lasname": "Bond",
     "nickname" : "007"
 }
 

MongoDB V4.4.2 — Symfony V4.20.5 — PHP V7.4 — Doctrine/ mongodb-odm-bundle V4.2

ВОТ МОИ PHP-ФАЙЛЫ :

Личный документ (Юридическое лицо)

 //   src/Document/Person.php

<?php

namespace AppDocument;

use DoctrineODMMongoDBMappingAnnotations as MongoDB;

/**
 * @MongoDBDocument
 */
class Person
{
    /**
     * @MongoDBId
     */
    protected $id;
     /**
     * @MongoDBField(type="collection")        // !! Am I wrong ? ?
     */
    protected $names;    
}
 

Тип человека (конструктор форм)

 // src/Form/Type/PersonType.php 

<?php

namespace AppFormType;

use AppDocumentPerson;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormExtensionCoreTypeCollectionType; // !! Am I wrong ?
use SymfonyComponentFormExtensionCoreTypeSubmitType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;

class PersonType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('names', CollectionType::class,        // !! Am I wrong ?
                    [
                     'entry_type' => TextType::class,
                     'allow_add' => true,
                     'by_reference' => false,
            ]);    
    }

    public function configureOptions(OptionsResolver $resolver){
      $resolver->setDefaults([
        'data_class' => Person::class 
      ]);
    }    
}
 

Контроллер

 // src/Controller/PersonController.php

<?php

namespace AppController;

use AppDocumentPerson;
use AppFormTypePersonType;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use DoctrineODMMongoDBDocumentManager;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute; 
    
class PersonController extends AbstractController {

    /**
    * @Route("/mongo/", name="mongo")
    */    
    public function new(Request $request DocumentManager $dm): Response {

        $person = new Person();
        $form = $this->createForm(PersonType::class, $person, []);

        //If form is submitted I know how to persist data. (with $dm->persist)
        //But problem is how to generate the form and then when It's submitted
        //the "names" field in my mongo db embed the fields lastname, name, and nickname
            
        return $this->render('dashboard/enrolment.html.twig', [
            'person_form' => $form->createView(),
        ]);   
     }
}
 

Комментарии:

1. Является ли name сущностью?

2. Извините, был болен: -(No name не является сущностью @ArleighHix

3. Тогда коллекция, вероятно, не является правильным типом, то есть для нескольких экземпляров одного и того же поля, как в OneToMany отношении. Вы должны просто добавить отдельные поля. Если вы должны сохранить их в одном столбце, вы можете обработать эту логику вручную в контроллере перед сохранением, в методах установки объекта или, возможно, в прослушивателе событий.

4. doctrine-project.org/projects/doctrine-mongodb-odm/en/2.2/…