人们如何设计其服务层界面?

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

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

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

    ... etc
}

服务中的SavePerson是否应该对整个$输入结构或上下文(在PHP,关联数组中)进行论证?

例如 -

public function savePerson(array $input) {

或者应该将所有输入字段分开并提供“硬”接口

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

谢谢。

保罗

有帮助吗?

解决方案

如果您要遵循MVC精神 savePerson 方法不应接受原始输入。它不应与来自UI的数据格式直接结合。取而代之的是,它应该接受服务域项中定义的输入,例如“人”对象。 (这可能只是像科比建议的那样的关联阵列)。将原始输入映射到服务所需的格式是控制器操作方法的工作。

此额外翻译步骤的好处是,它将您的服务(型号)与UI隔离。如果实现其他UI,则无需更改服务界面。您只需要编写新的控制器(当然还有视图)。

而你的榜样喜欢 savePerson($title, $firstName, $lastName...) 是正确的想法,当您拥有超过2或3个参数的方法时,通常是一个不好的信号。您应该能够将相关参数分为某种高级对象。

其他提示

我的MVC应用程序是这样的:控制器 - >服务 - > ORM/其他库

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

因此,我认为您的第一个例子是:

public function savePerson($personArray);

此外,您不需要一个“硬”接口,因为您的表单库将负责验证/过滤/消毒,因此我们可以假设关联数组将是有效的,加上方法定义将在命名参数中荒谬地荒谬。

我将分开所有输入字段,并在服务中提供一个“硬”接口

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

它的清洁剂,无需假设。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top