php - 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()
]);
}
}
谢谢
解决方案
在我看来,在 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 文档中的更多信息。
推荐阅读
- excel - 创建用户窗体时Excel vba内存不足
- python - Azure yaml Pipeline 在脚本中隐藏密码
- object-detection - 目标检测的边界区域
- flutter - 在 Android Studio 中不断记录“D/MediaCodecInfo”,它是什么,以及如何禁用或修复它?
- xero-api - 在调用 getinvoices 时调用 auth、refresh 和 gettenants 后,xero api 因未经授权(401 或 403)而失败
- c++ - 具有默认行为的模板自定义点不执行任何操作
- mysql - 如何使用 WHERE 子句获得前 3 个平均值?
- android - 最初将屏幕方向更改为横向时,触发传感器方向,然后在 PORTRAIT 中加载
- python - 循环抛出两个列表,我想从每个列表中弹出
- android - Unity:错误AndroidVideoMedia,找不到曲目?