【发布时间】:2013-10-29 00:08:03
【问题描述】:
由于 ServiceLocatorAwareInterface 可能是 removed from the AbstractController in ZF3,因此应该通过构造函数或 setter 方法传递依赖关系。
考虑到这一点,请考虑用户或站点控制器的用例,其中包含注册、激活帐户、登录、注销等操作。这至少需要一个 UserService 和 2 个表单。添加更多相关操作(远程身份验证、帐户链接等),您最终会得到 4 或 5 个表单。
通过构造函数传递所有这些依赖关系充其量是混乱的,更重要的是,每个操作通常只需要一个表单。
您认为以下哪种技术更好,为什么?
-
为每个操作创建单独的控制器,以便每个控制器只需要一个表单(除了服务之外)。例如RegistrationController、LoginController、LinkAccountController等
- 您最终会以这种方式获得大量控制器。
-
在控制器的工厂中,根据请求的操作提供不同的表单。
- 控制器的构造依赖于这个工厂,更具体地说是请求环境(路由等)。您可以直接构造控制器(用于测试或其他),但是您需要确保依赖关系可用否则抛出异常。
-
使用事件管理器,在需要表单时触发控制器中的事件,让事件处理程序按需提供依赖。
- 这种技术被描述为here。
- 然后,您的控制器将依赖于 EventManager 而不是 ServiceLocator,这可能不会好多少。
-
将 FormElementManager 传递给控制器,并从中请求表单。
- 很可能不会比 SL 本身更好。
-
直接在控制器内部构造表单。
- 这对可测试性有何影响?
- 同样的问题也适用于处理具有多个服务(而不是表单)的控制器。
其他?
另见:
【问题讨论】:
-
我不会将此作为答案发布,但是:1) 我不认为很多控制器是个问题。 2)永远不会这样做。工厂是废品逻辑。不要试图对其进行大修。 3) maaaaagic - 尝试调试它! 4) 表单元素管理器 IS 是一个 ServiceLocator 5) 不,我们远离了它
标签: zend-framework2 dependency-management service-locator zend-form2 zend-framework3