人们如何设计服务层接口?
我正在编写一个大型Web应用程序(在PHP中),我们正在使用MVC,并编写瘦控制器,例如(伪代码如下)
public savePersonAction() {
$input = filter($_GET);
... input validation ...
$result = $this->_service->savePerson( ? );
... etc
}
服务中的savePerson是否应该接受整个$ input结构或上下文的参数(在PHP中,是一个关联数组)?
E.g。这个 -
public function savePerson(array $input) {
或者应该将所有输入字段分开并提供“硬”接口,例如
public function savePerson($title, $firstName, $lastName, $dateOfBirth, ... etc.. for many more) {
感谢。
保
答案 0 :(得分:5)
如果您要遵循MVC精神,则savePerson
方法不应接受原始输入。它不应该与来自ui的数据格式直接耦合。相反,它应该接受在服务域条款中定义的输入,例如“人”对象。 (这可能只是像Cobby建议的关联数组)。将原始输入映射到服务所需的格式是控制器动作方法的作用。
这个额外翻译步骤的好处是它将您的服务(模型)与ui隔离开来。如果实现不同的ui,则无需更改服务接口。你只需要编写新的控制器(当然还有视图)。
虽然像savePerson($title, $firstName, $lastName...)
这样的例子是正确的想法,但是当你的方法有超过2或3个参数时,这通常是一个不好的迹象。您应该能够将相关参数分组到某种更高级别的对象中。
答案 1 :(得分:1)
我的MVC应用程序的结构如下: 控制器 - >服务 - > ORM /其他图书馆
要回答您的问题,通常在您的控制器中,您将获得表单数据作为数组,即$ form-> getValues()或类似的东西。在可维护性方面,最好将您的服务除了数组作为参数,这样如果您向表单添加另一个字段,您只需更新表单和服务,您的控制器可以保持不变并仍然有效。
所以我想你的第一个例子:
public function savePerson($personArray);
此外,您不需要“硬”接口,因为您的表单库将负责验证/过滤/清理,因此我们可以假设关联数组将是有效的,而且方法定义将在命名时变得非常长参数。
答案 2 :(得分:0)
我会将所有输入字段分开并提供一个" hard"服务中的接口,例如
public function savePerson($title, $firstName, $lastName, $dateOfBirth) {...}
它更干净,没有必要的假设。