У меня есть 2 сущности: Статья, Комментарий
У каждого есть свой FormType -> ArticleType, CommentType
Для создания статей я просто использую тип статьи для создания формы.
Для комментариев я использую свой CommentType, но я также хочу изменить некоторую информацию из статьи.
Например: Добавить комментарий и иметь возможность изменять категории статей.
Это означает, что мне нужно добавить поле «Категория статьи» к моему CommentType. Так как есть способы встраивания в полную форму. Мне было интересно, могу ли я встроить только часть формы.
Тип статьи:
$builder->add('headline', TextType::class, [ ... ])
->add('text', TextType::class, [ ... ])
->add('category', EntityType:class, [ ... ])
Тип комментария:
$builder->add('article', ArticleType::class, [ ... ])
//adds all fields of ArticleType, but only want the category field
Есть ли способ приблизиться к этому, не добавляя часть категории из моего ArticleType? (предотвратить дублирование кода).
Также мне было интересно, как будет выглядеть контроллер для моего случая. Сейчас я использую следующий код, который может нуждаться в улучшении:
/**
* @Route("/article/{id}", name = "app_article")
*/
public function article(Request $request, Article $article)
{
$comment = new Comment();
$comment->setArticle($article); //to modify current article values
$form = $this->createForm(CommentType::class, $comment);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$tmpArticle = $comment->getArticle(); //if I don't get the article from my comment, doctrine/symfony creates a *new* Article - which I dont want
$article->setCategory($tmpArticle->getCategory());
$em->persist($comment);
$em->persist($article);
$em->flush();
return $this->redirectToRoute(...);
}
return $this->render(...);
}
Спасибо.




Если вы хотите выбрать существующую статью для категории. Следует ли использовать EntityType: Связь
С параметрами вы можете выбрать метку при выборе.
Может быть, моя идея глупа. Если вы напишете: $builder->add('article.category', EntityType:class, [ ... ])
точки [.] являются недопустимыми символами в этом контексте =) Имена должны начинаться с буквы, цифры или подчеркивания и содержать только буквы, цифры, цифры, символы подчеркивания ("_"), дефисы ("-") и двоеточия (":" ).
Решение: Я изменил свой тип статьи, чтобы использовать все поля по умолчанию, но когда я использую конкретный параметр, он использует только несколько необходимых мне полей.
Это то, что я делаю прямо сейчас. К сожалению, мне не нравится это решение, потому что я также использую FormEvents для динамического изменения формы. Если я использую EntityType, мне нужно переписать все события FormEvents, которые у меня практически уже есть. Пример: если я выбираю категорию, я получаю выбор с подкатегориями. Вот почему я хочу использовать свой ArticleType, поэтому мне (если возможно) не нужно все дублировать :)