Symfony2使用"全局函数"在没有过度杀伤的形式内

时间:2015-05-10 17:15:55

标签: symfony symfony-forms

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

我有一个通用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...);

有效。

这好吗/优雅?

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

谢谢!

SN

1 个答案:

答案 0 :(得分:1)

只要您拥有“GeneralUtil”类,就像现在这样简单:没有任何依赖关系和任何配置参数,您的解决方案是公平的。但是你应该考虑更多的方面:

  1. “GeneralUtil”会在其他地方重复使用吗?
  2. 您需要进行单元测试吗?如果是这样,如果你计划进行“纯”单元测试并使用mock进行依赖注入(DI),你是否计划模拟util?
  3. 您是否计划扩展util的功能?它将来会获得一些依赖关系或配置吗?
  4. 如果是,那么最好从Symfony SOA(面向服务的体系结构)方法中获益并将您的代码重构为SOA和DI,这将允许您遵循另一个重要模式作为DRY(不要重复自己){ {3}}

    更新到您的公司:

    所以你可以从http://en.wikipedia.org/wiki/Don%27t_repeat_yourself

    看到
      

    将表单类型定义为服务是一种很好的做法并且可以实现   非常容易在您的应用程序中使用。

    但正如我已经解释过的utils类,类似的逻辑是关于表单的。因此,如果您计划重用您的表单,那么您可以将其作为服务来执行,但如果您将使用几个不同的表单来使用您的utils类,那么最好将表单保留为类,但为utils提供服务。此外,如果您认为有可能覆盖其他形式,即第三方形式,您可以这样做。

    因此,作为服务的表单中的好处列表:

    • 在多次使用的情况下,它只初始化一次

    • 易于被其他形式覆盖

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