我正在开发一个大量使用服务的MVC应用程序。我的问题是,在创建实体时,我应该从控制器内部还是从服务中填充其属性?
示例1 - 从控制器内填充:
// MyController.php
function someAction() {
$name = $_POST['name'];
$gender = $_POST['gender'];
$user = new User();
$user->setName($name);
$user->setGender($gender);
$userService->createUser($user);
}
// UserService.php
function createUser($user) {
$this->saveToDb($user);
}
示例2 - 从服务中填充:
// MyController.php
function someAction() {
$name = $_POST['name'];
$gender = $_POST['gender'];
$userService->createUser($name, $gender);
}
// UserService.php
function createUser($name, $gender) {
$user = new User();
$user->setName($name);
$user->setGender($gender);
$this->saveToDb($user);
}
我更喜欢第二种方法,因为我觉得控制器应该简单地委托工作,服务层应该完成繁重的工作。
它似乎也遵循DRY原则,因为如果我有多个控制器需要创建User
个对象,我将不会重复任何代码。编写单元测试也是如此 - 我可以简单地将所有参数传递给服务对象。
但我已经看到了第一种方法,我想知道它是否有一些我没有看到的优势。
答案 0 :(得分:1)
我会采用第二种方法,因为它是DRY。
第一种方法是可以的,但是您应该使用DTO来代替数据库实体,您可以使用DTO来填充服务中的数据库实体。我不会从服务中公开数据库实体,以便将DB层与表示层分离。