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" 而言如此简单:没有任何依赖项和任何配置参数,您的解决方案是公平的。但是还有一些你应该考虑的方面:
- 可以"GeneralUtil"在其他地方重复使用吗?
- 您需要进行单元测试吗?如果是这样,如果您打算进行 "pure" 单元测试并使用模拟进行依赖注入 (DI),您是否打算模拟该实用程序?
- 您打算扩展该实用程序的功能吗?将来它会得到一些依赖或配置吗?
如果是,那么最好从 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 其他服务全局配置
我知道我可以做很多事情...但我想避免矫枉过正。
我有一个 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" 而言如此简单:没有任何依赖项和任何配置参数,您的解决方案是公平的。但是还有一些你应该考虑的方面:
- 可以"GeneralUtil"在其他地方重复使用吗?
- 您需要进行单元测试吗?如果是这样,如果您打算进行 "pure" 单元测试并使用模拟进行依赖注入 (DI),您是否打算模拟该实用程序?
- 您打算扩展该实用程序的功能吗?将来它会得到一些依赖或配置吗?
如果是,那么最好从 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 其他服务全局配置