Php Symfony控制器中的表单

Php Symfony控制器中的表单,php,symfony,dependency-injection,symfony4,Php,Symfony,Dependency Injection,Symfony4,我不明白我应该把我的表格代码放在我的symfony4项目的什么地方。据我所知,您不应该在控制器中有业务逻辑,但您需要扩展控制器以使用$this->createForm class HomeController extends Controller { public function index(Request $request) { $article = new Article(); $form = $this->createForm(Art

我不明白我应该把我的表格代码放在我的symfony4项目的什么地方。据我所知,您不应该在控制器中有业务逻辑,但您需要扩展控制器以使用$this->createForm

class HomeController extends Controller
{
    public function index(Request $request)
    {
        $article = new Article();
        $form = $this->createForm(ArticleType::class, $article);
        $form->handleRequest($request);

       if ($form->isSubmitted() && $form->isValid()) {
           $article = $form->getData();

           $entityManager = $this->getDoctrine()->getManager();
           $entityManager->persist($article);

           return $this->redirect("/");
       }
       return $this->render('home/home.html.twig', [
            'form' => $form->createView()
       ]);
   }
}

谢谢

在我看来,在Controller中使用表单没有什么错。 然而,如果您想保持控制器的苗条,您可以将业务逻辑转移到服务。 例如:

<?php
// src/Form/Type/ArticleType.php
namespace App\Form\Type;

use App\Entity\Article;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

//you must use the classes you use in the form
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;

class ArticleType extends AbstractType
{
   public function buildForm(FormBuilderInterface $builder, array $options)
   {
    //add your form code here
      $builder
         ->add()
         ->add ()
       ;
   }

   public function configureOptions(OptionsResolver $resolver)
   {
      $resolver->setDefaults(array(
      //write here your options
      ));
   }

   public function getBlockPrefix()
   {
      return null;
   }

}
应用程序\控制器\家庭控制器: 类HomeController扩展控制器 { //注入物品服务 公共函数indexRequest$request,ArticleServiceInterface$articleService { $article=新文章; $form=$this->createFormArticleType::class$article; $form->HandlerRequest$请求; 如果$form->isSubmitted&&$form->isValid{ $articleService->create$form->getData; 返回$this->redirect/; } 返回$this->render'home/home.html.twig'[ 'form'=>$form->createView ]; } } App\Services\ArticleService: 类ArticleService实现ArticleServiceInterface { 私人$entityManager; 公共函数uu ConstructentityManager接口$entityManager{ $this->entityManager=$entityManager; } 公共函数createArticle$article { //你可以在这里做一些额外的事情 $this->entityManager->persist$article; $this->entityManager->flush; } } 在这个特定的例子中,这是一个完全的过度杀伤力,但给出了一个可能的想法


更多信息请参见。

在一个大中型项目中,或者为了更加有序,您必须将其放入src/Form/Type/folder中,您必须创建它。在您的示例中:

<?php
// src/Form/Type/ArticleType.php
namespace App\Form\Type;

use App\Entity\Article;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

//you must use the classes you use in the form
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;

class ArticleType extends AbstractType
{
   public function buildForm(FormBuilderInterface $builder, array $options)
   {
    //add your form code here
      $builder
         ->add()
         ->add ()
       ;
   }

   public function configureOptions(OptionsResolver $resolver)
   {
      $resolver->setDefaults(array(
      //write here your options
      ));
   }

   public function getBlockPrefix()
   {
      return null;
   }

}

因为OP已经在控制器中调用了它:$form=$this->createFormArticleType::class,$article;,我猜他已经定义了ArticleType类了。当然,但他问把表单代码放在哪里,大型项目的符号结构也很清楚。