我正在试图弄清楚Repository模式如何工作以及如何在自定义MVC模式中实现它。
据我了解,Repository是一个简单地从实体类返回数据或将实体类保存到持久层的层。
现在我现在看到这样:
请求进入我的控制器以创建用户。只是一个用户名和密码。我的控制器将执行以下操作:
function CreateAction ( )
{
$userRepo = new userRepository ( );
$user = new userEntity ( );
$user->setUsername('user');
$user->setPassword('123456');
$userRepo->create($user);
}
然后我的 userRepository 类看起来像这样:
class userRepository
{
public function create ( User $user )
{
$this->db->exec ( "INSERT INTO ... QUERY TO SAVE THE USER" );
}
}
我的 userEntity 类看起来像这样:
class userEntity
{
private $username;
private $password;
public function setUsername ( $username )
{
$this->username = $username;
}
public function getUsername ( )
{
return $this->username;
}
public function setPassword ( $password )
{
$this->password = $password;
}
public function getPassword ( )
{
return $this->password;
}
}
现在我认为第一件事是错误的是我在存储库类中使用了一个查询。我在哪里实际将userEntity类保存到数据库?换句话说,我在哪里执行实际的SQL查询?我想正确的方法是在存储库的'create'方法中调用DAO。但我仍然试图弄清楚DAO的真实外观以及与MVC模式中的“模型”相比有多么不同。
但除此之外,这是实现存储库模式的正确方法吗?
答案 0 :(得分:12)
您的存储库对我来说看起来更像是一个TableDataGateway。存储库的想法是在映射层之上的另一层,它在域对象和数据库之间进行调解。它还可以作为域对象的内存存储(您的示例中缺少某些内容),并且可以封装Factory以创建新实体。它们通常还允许按规范模式查询存储库:
这是一个相当复杂的模式。你可以在
中找到关于Repository的好文章答案 1 :(得分:0)
是的,这是Repository模式的正确实现。 DAO模式通常也很有用,但是您的实现没有任何问题。
DAO是一种简单的模式,它将持久性逻辑与业务逻辑分开。它会创建CRUD操作,而您的实体将包含业务逻辑的方法,因此它将持久性的责任与您的域分开。我通常为单个实体和聚合的存储库寻找DAO,允许我做像productCatalogRepository.Update()这样的事情,然后它会迭代产品DAO并让它们自己存储。