我最近被Jani Hartikainen在讨论如何最好地处理 MVC 应用程序中的表单数据时介绍了服务层。在做了一些阅读之后,我真的可以看到这种方法的好处。我的问题是这样的:
服务类应该如何构建?
- 首先,
user_service()
我的模型是合适的类名user()
还是有其他标准? - 由于我的服务中的方法只会执行一项任务,因此认为这些总是可以是正确的
static function
吗?服务类不代表数据,而是一系列动作,所以这似乎是合适的。 - 服务方法是否应该只接受一个
argument
,这将是一个array
?
考虑一个表单已将数据发布到控制器以保存用户数据:
<?php
class form_controller extends controller
{
public function process_submit()
{
if(user_service::update_preferences($_POST))
{
echo json_encode(array('success' => true));
}
else
{
echo json_encode(array('success' => false));
}
}
}
class user_service
{
// Accepts array()
public static function update_preferences($fields)
{
// Check for required fields
if((
isset($fields['firstname']) and
isset($fields['lastname']) and
isset($fields['email'])
) == false
{
return false;
}
// Update user
try
{
$s = new user();
$s->set_firstname($fields['firstname']);
$s->set_lastname($fields['lastname']);
$s->set_email($fields['email']);
$s->update();
return true;
}
catch(Exception $e)
{
return false;
}
}
}
我觉得这是一个很好的方法,因为:
- 我可以在我的表单中添加另一个字段,我不必更新
controller
,只需更新service
. 控制器不应该关心正在传递什么数据,这似乎是正确的,只要它被传递。这使我的控制器很小,并且我的模型中的逻辑。 - 如果我没有通过
array
,我可以设置带有多个参数的函数。例如我的功能可能是update_preferences($firstname, $lastname, $email)
. 然而,这可能会使函数具有超过 20 个参数(对于大型形式),并且使用顺序会变得很糟糕。 - 我可以通过一个
object
,但这有意义吗?如果我正在创建一个对象,它应该是它所代表的对象(在这种情况下是用户)对吗?但是控制器实例化用户对象有意义吗?这不是服务层的重点吗? - 也许有一些方法有多个参数(当只有一到三个时)和一些接受数组的方法(当有很多字段时)。这似乎是一场噩梦,因为您总是必须引用该类才能知道该特定方法要求什么。
有人对这里的正确做法有意见吗?我在正确的轨道上吗?你过去做了什么?非常感谢!