我做什么 :
我的模型不是链接到数据库的实体(当我不使用学说时),所以没有“活动记录”方法。一个对象不知道如何获取它的依赖项(例如,一个用户可能有 n 条评论,我的模型不知道如何获取评论)。
class User{
private $name;
private $password;
// getter and setters
}
我的服务包含一些可以从提供者那里获取模型的业务逻辑,一个服务可以有很多提供者。
class UserService{
function __construct(IUserProvider $userProvider){
$this->userProvider = $userProvider
}
function getUsers(){
// return an array of user objects
return $this->userProvider->getUsers();
}
}
最后,我有一个数据提供者,它知道如何从数据库、文本文件、json 文件、网络服务请求数据:
class UserProvider implements IUserProvider{
function __construct(Connection $connection){
$this->connection = $connection;
}
function getUsers(){
return $this->toUsers($this->connection->fetchAssoc("Select * from users"));
}
function toUsers(array $datas){
// convert user records to an array of User
(...)
return $users;
}
}
然后界面
interface IUserProvider{
/**@return array an array of User */
function getUsers();
}
如果我需要获取用户评论,那么我的评论服务知道如何从用户 ID 获取评论。因此,要获取用户及其评论,我需要 2 个对数据库的请求。一个来自 UserProvider ,另一个来自 CommentProvider。
所以我有 3 层:
- 我的应用层(显示用户,响应任何请求......)
- 我的服务层(它必须使用命令行界面并且不知道我的 Web 应用程序,除了通常绑定到我使用的框架的密码编码和 ACL 的东西可能......)
- 我的数据访问层对其他层一无所知,
我的层通信的唯一方式是通过我从层传递到层的模型。
而且我所有的类都是用依赖注入容器构建的,所以接线不是问题。
这是我制作的应用程序示例,它是开源的:https ://github.com/Mparaiso/silex-bookmarkly
欢迎任何想法。