我想知道在哪里存储一些与表单相关的自定义代码。我正在编写Symfony应用程序,用户可以在其中添加自己的类别(当然使用表单(。当用户添加其类别时,控制器内的表单代码会检查此表单是否已提交且有效。如果是,则将用户的类别和基于类别名称创建的URI添加到数据库中。现在,整个代码和逻辑存储在addCategory((操作内的CategoryController中。就像下面一样:
public function addCategory(Request $request): Response
{
// create the whole form inside CategoryType class
$form = $this->createForm(CategoryType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$categories = $form->getData();
$categories->setName(preg_replace(
'#s+#', ' ', $categories->getName()));
$categories->setCategoryUri(strtolower(str_replace(
' ', '-', $categories->getName())));
$this->getDoctrine()->getRepository(Categories::class)
->addOneCategory($categories);
return $this->redirectToRoute('flashcard_index');
}
return $this->render('category/add_category.html.twig', [
'form' => $form->createView(),
'slug' => 'Add category'
]);
}
正如你在if语句中看到的那样,我正在写一些代码。首先,用户数据被保存到$categories
变量中,接下来我将使用preg_replace()
删除多个空间(以防用户在表单字段中输入多个空间(,最后我使用strtolower()
和str_replace()
函数基于类别名称创建URI。
问题是,我不知道将上述逻辑存储在控制器操作中是否是一种好的做法,如果不是,将该逻辑存储在哪里?你能回答我这个问题吗?提前感谢您的回答!
然后,存储逻辑的最佳位置是您所说的控制器外部。你必须问的问题是,"我如何才能以更快、更容易的方式测试我的代码?">
在一个单独的班级里。不是一个千线经理级别,只有一个级别AddCategorieHandler
如果您想要一个解耦的代码,请从form
中删除data_class。如果您想从表单中获取数据,只需调用form->getData()
,就会得到一个数组。
然后,您可以使用symfony信使组件创建一个message
。此消息将与处理程序AddCategorieHandler
相关联。
奖励,信使组件可以调用条令来启动交易并为您刷新。
所以。。在你的控制器中,你只需要创建一条消息,使用信使发送它,瞧。
您的AddCategorieHandler
具有您想要的所有逻辑,易于测试(无需模拟条令或功能测试。(
如果要删除一个类别,只需创建一个DeleteCategoryHandler
即可。
你必须创建很多类,但从长远来看,在一个大项目中,你会很乐意在整个逻辑的2秒内运行2000个测试!