应用服务层 - 如何编写API方法接口

时间:2010-11-04 01:34:39

标签: php model-view-controller web-applications service service-layer

人们如何设计服务层接口?

我正在编写一个大型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) {

感谢。

3 个答案:

答案 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) {...}

它更干净,没有必要的假设。