0

我想知道在哪里存储一些与表单相关的自定义代码。我正在编写 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。

问题是我不知道将上述逻辑存储在控制器操作中是否是一种好习惯,如果不是,那么在哪里存储此逻辑?你能回答我这个问题吗?预先感谢您的所有答案!

4

1 回答 1

1

那么存储逻辑的最佳位置就像你说的那样在你的控制器之外。您必须问的问题是“我怎样才能以更快、更简单的方式测试我的代码?”

在一个单独的班级。不是千行的经理班,只有一个班AddCategorieHandler

如果您想要一个解耦代码,请从您的form. 如果您想从表单中获取数据,只需调用form->getData(),您将获得一个数组。

然后你可以messagesymfony messenger 组件创建一个。此消息将与处理程序相关联AddCategorieHandler

奖励,Messenger 组件可以调用原则来启动交易并为您刷新。

所以..在您的控制器中,您只需要创建一条消息,使用 Messenger 发送它,然后瞧。

而且您AddCategorieHandler拥有所需的所有逻辑,易于测试(无需模拟 Doctrine 或功能测试..)

如果要删除类别,只需创建一个DeleteCategoryHandler.

您必须创建很多类,但在长期的大型项目中,您会很高兴在整个逻辑的 2 秒内运行 2,000 个测试!

于 2020-04-09T12:07:07.047 回答