首页 > 解决方案 > Symfony 控制器中的表单

问题描述

我不明白我应该将表单代码放在我的 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()
       ]);
   }
}

谢谢

标签: phpsymfonydependency-injectionsymfony4

解决方案


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

应用\控制器\家庭控制器:

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 文档中的更多信息。


推荐阅读