#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/…