【问题标题】:Form in Symfony controllerSymfony 控制器中的表单
【发布时间】:2018-06-04 16:24:50
【问题描述】:

我不明白我应该将表单代码放在我的 Symfony 4 项目中的什么位置。据我了解,您不应该在控制器中有业务逻辑,但您需要扩展控制器以使用 $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()
       ]);
   }
}

谢谢

【问题讨论】:

    标签: php symfony dependency-injection symfony4


    【解决方案1】:

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

    App\Controllers\HomeController:

    class HomeController extends Controller
    {
        // Inject ArticleService
        public function index(Request $request, ArticleServiceInterface $articleService)
        {
            $article = new Article();
            $form = $this->createForm(ArticleType::class, $article);
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
    
                $articleService->create($form->getData());
    
                return $this->redirect("/");
            }
            return $this->render('home/home.html.twig', [
                'form' => $form->createView()
            ]);
        }
    }
    

    应用\服务\文章服务:

    class ArticleService implements ArticleServiceInterface
    {
        private $entityManager;
    
        public function __construct(EntityManagerInterface $entityManager) {
            $this->entityManager = $entityManager;
        }
    
        public function create(Article $article)
        {
            // you may do some extra stuff here
            $this->entityManager->persist($article);
            $this->entityManager->flush();
        }
    }
    

    在这个特定的示例中,这完全是矫枉过正,但给出了一个想法。

    Symfony docs 中的更多信息。

    【讨论】:

      【解决方案2】:

      在一个中大型项目中(或者更有序),您必须放入 src/Form/Type/ 文件夹(您必须创建它)。在您的示例中:

      <?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-&gt;createForm(ArticleType::class, $article);,那么我猜他已经定义了 ArticleType 类。
      • 当然,但是他问他的表单代码放在哪里,并且 Symfony 的大型项目结构很清楚。
      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 2018-08-03
      相关资源
      最近更新 更多