【问题标题】:Symfony - where to store custom Form logic?Symfony - 在哪里存储自定义表单逻辑?
【发布时间】:2020-04-09 20:07:07
【问题描述】:

我想知道在哪里存储一些与表单相关的自定义代码。我正在编写 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() 删除多个空格(如果用户在表单字段中输入多个空格),最后我使用@ 创建基于类别名称的URI 987654326@ 和 str_replace() 函数。

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

【问题讨论】:

  • 我认为您正在寻找表单事件symfony.com/doc/current/form/events.html。这是一种访问表单内数据的方法。可能您需要 presubmit 事件。
  • 这是保持简单与保持“纯粹”之间的权衡。是的,控制器动作应该保持小,但是相当多的 Symfony 应用程序确实在动作中加入了逻辑并且工作得很好。可能有点跑题了,但是您应该使用Data Transformer 处理正则表达式转换。
  • 谢谢!我要读一下!

标签: php forms symfony custom-code


【解决方案1】:

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

在一个单独的类中。不是千行的经理班,就一个班AddCategorieHandler

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

然后您可以使用symfony messenger component 创建一个message。此消息将关联到处理程序 AddCategorieHandler

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

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

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

如果您想删除一个类别,只需创建一个DeleteCategoryHandler

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

【讨论】:

  • 在这种情况下使用 messenger 组件可能有点矫枉过正。 Event Dispatcher 可能是更合适的选择。
  • EventDispatcher 不是一个好的选择...事件可以被分发到任何地方,并且可以被任何东西捕获。这不是一个健壮的代码。 Messenger 就是一个例子,你可以在没有它的情况下创建你的处理程序。在大型项目中,eventDispatcher 很难。
  • 有趣。消息也可以从任何地方发送并被多个处理程序捕获。事件可以追溯到最初的 Symfony 2.0 版本,并且直到今天都被广泛使用。尤其是核心。从未听过任何人将事件描述为困难。但我猜每个人都有自己的想法。
  • 非常感谢你们的回答!该应用程序不是很大的项目。除了上述逻辑之外,应用程序还将包含其他类型的逻辑(与表单相关或不相关)。那么在这种情况下,您建议使用哪些? Messenger 还是 Event Dispacher?或者也许是 alexcm 提出的 Form Events
  • 从一个单独的类开始为您的逻辑。然后,尝试 Messenger,然后尝试事件调度程序。做出你的选择!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多