7

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

我正在编写一个大型 Web 应用程序(在 PHP 中),我们正在使用 MVC,并编写瘦控制器,例如(伪代码如下)

public savePersonAction() {
    $input = filter($_GET);
    ... input validation ...

    $result = $this->_service->savePerson( ? );

    ... etc
}

服务中的 savePerson 是否应该接受整个 $input 结构或上下文的参数(在 PHP 中,一个关联数组)?

例如这个 -

public function savePerson(array $input) {

或者应该将所有输入字段分开并提供“硬”界面,例如

public function savePerson($title, $firstName, $lastName, $dateOfBirth, ... etc.. for many more) {

谢谢。

保罗

4

3 回答 3

5

如果您要遵循 MVC 精神,您的savePerson方法不应该接受原始输入。它不应该与来自 ui 的数据格式直接耦合。相反,它应该接受在您的服务域条款中定义的输入,例如“人”对象。(这可能只是像 Cobby 建议的关联数组)。控制器操作方法的工作是将原始输入映射到服务所需的格式。

这个额外的翻译步骤的好处是它将您的服务(模型)与 ui 隔离开来。如果实现不同的ui,则不需要更改服务接口。您只需要编写新的控制器(当然还有视图)。

虽然您喜欢的示例savePerson($title, $firstName, $lastName...)是正确的想法,但当您的方法具有超过 2 或 3 个参数时,这通常是一个不好的迹象。您应该能够将相关参数分组到某种更高级别的对象中。

于 2010-11-04T02:59:27.763 回答
1

我的 MVC 应用程序的结构如下:Controller -> Service -> ORM/other library

要回答您的问题,通常在您的控制器中,您将获取表单数据作为数组,即 $form->getValues() 或类似的东西。就可维护性而言,最好是您的服务除了数组作为参数之外,这样,如果您向表单添加另一个字段,您只需更新表单和服务,您的控制器可以保持不变并且仍然可以工作。

所以我想用你的第一个例子:

public function savePerson($personArray);

此外,您不应该需要一个“硬”接口,因为您的表单库将负责验证/过滤/清理,因此我们可以假设关联数组将是有效的,而且方法定义会因命名参数而变得非常长。

于 2010-11-04T01:41:14.073 回答
0

我会分离出所有输入字段并在服务中提供一个“硬”接口,例如

public function savePerson($title, $firstName, $lastName, $dateOfBirth) {...}

它更干净,不需要任何假设。

于 2015-04-09T20:37:17.417 回答