Symfony2 在表单中使用 "global function" 而不会矫枉过正

Symfony2 using a "global function" inside a form without overkill

我知道我可以做很多事情...但我想避免矫枉过正。

我有一个 class 具有通用的 util 方法。我希望能够从 formType 内部调用这些方法之一。

我所做的是:

在我添加的 formType 里面

use AppBundle\Util\GeneralUtil;

class HRMgmtFormType extends AbstractType
{

    public function __construct(GeneralUtil $util)
    {
        $this->util = $util;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $timeCommitment = $this->util->generatePercentVectorByStep(1);

    ...all the rest of the stuff

当我从控制器调用它时,我有:

$form = $this->createForm(new HRMgmtFormType(new GeneralUtil()), array(...all the stuff I need here...);

有效。

这是ok/elegant吗?

我基本上避免将我的通用工具 class 声明为服务,最重要的是将我的表单声明为服务(并在其中注入 generalUtil 服务)。

谢谢!

SN

就您现在拥有的 class "GeneralUtil" 而言如此简单:没有任何依赖项和任何配置参数,您的解决方案是公平的。但是还有一些你应该考虑的方面:

  1. 可以"GeneralUtil"在其他地方重复使用吗?
  2. 您需要进行单元测试吗?如果是这样,如果您打算进行 "pure" 单元测试并使用模拟进行依赖注入 (DI),您是否打算模拟该实用程序?
  3. 您打算扩展该实用程序的功能吗?将来它会得到一些依赖或配置吗?

如果是,那么最好从 Symfony SOA(面向服务的架构)方法中获益并将您的代码重构为 SOA 和 DI,这将允许您遵循另一个重要的模式,如 DRY(不要重复自己) http://en.wikipedia.org/wiki/Don%27t_repeat_yourself

更新您的评论:

所以从http://symfony.com/doc/current/book/forms.html#defining-your-forms-as-services

可以看出

Defining your form type as a service is a good practice and makes it really easy to use in your application.

但是正如我已经解释过的实用程序 class,类似的逻辑是关于表单的。因此,如果您打算重用您的表单,那么您可以将其作为服务来完成,但是如果您有多个不同的表单将使用您的实用程序 class,那么最好将表单保留为 class,但是为实用程序提供服务。此外,如果您发现有可能覆盖您的表格,您可以这样做,即其他形式,即第 3 方表格。

因此,表单即服务的好处列表:

  • 多次使用时,只初始化一次

  • 容易被其他形式覆盖

  • 从参数和 DI 其他服务全局配置