Php 在MVC中设置存储库模式
我试图弄清楚存储库模式是如何工作的,以及如何在自定义MVC模式中实现它 据我所知,存储库是一个简单地从实体类返回数据或将实体类保存到持久层的层 现在我看到它是这样的:Php 在MVC中设置存储库模式,php,oop,design-patterns,repository-pattern,ddd-repositories,Php,Oop,Design Patterns,Repository Pattern,Ddd Repositories,我试图弄清楚存储库模式是如何工作的,以及如何在自定义MVC模式中实现它 据我所知,存储库是一个简单地从实体类返回数据或将实体类保存到持久层的层 现在我看到它是这样的: function CreateAction ( ) { $userRepo = new userRepository ( ); $user = new userEntity ( ); $user->setUsername('user'); $user->setPassword('123
function CreateAction ( )
{
$userRepo = new userRepository ( );
$user = new userEntity ( );
$user->setUsername('user');
$user->setPassword('123456');
$userRepo->create($user);
}
class userRepository
{
public function create ( User $user )
{
$this->db->exec ( "INSERT INTO ... QUERY TO SAVE THE USER" );
}
}
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;
}
}
一个请求进入我的控制器来创建一个用户。只有用户名和密码。我的控制器将执行以下操作:
function CreateAction ( )
{
$userRepo = new userRepository ( );
$user = new userEntity ( );
$user->setUsername('user');
$user->setPassword('123456');
$userRepo->create($user);
}
class userRepository
{
public function create ( User $user )
{
$this->db->exec ( "INSERT INTO ... QUERY TO SAVE THE USER" );
}
}
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;
}
}
然后,我的userRepository类如下所示:
function CreateAction ( )
{
$userRepo = new userRepository ( );
$user = new userEntity ( );
$user->setUsername('user');
$user->setPassword('123456');
$userRepo->create($user);
}
class userRepository
{
public function create ( User $user )
{
$this->db->exec ( "INSERT INTO ... QUERY TO SAVE THE USER" );
}
}
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类如下所示:
function CreateAction ( )
{
$userRepo = new userRepository ( );
$user = new userEntity ( );
$user->setUsername('user');
$user->setPassword('123456');
$userRepo->create($user);
}
class userRepository
{
public function create ( User $user )
{
$this->db->exec ( "INSERT INTO ... QUERY TO SAVE THE USER" );
}
}
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;
}
}
现在我认为这里的第一个错误是我在repository类中使用了一个查询。我应该在哪里将userEntity类保存到数据库?换句话说,我在哪里执行实际的SQL查询?我想正确的方法应该是在存储库的“create”方法中调用DAO。但我仍在试图弄清楚DAO的真实外观,以及它与MVC模式中的“模型”相比有多大的不同
但除此之外,这是实现存储库模式的正确方法吗?在我看来,您的存储库更像是一个TableDataGateway。存储库的概念是作为映射层之上的另一层,在域对象和数据库之间进行中介。它还充当域对象(示例中缺少的东西)的内存存储,并可能封装用于创建新实体的工厂。它们通常还允许按规范模式查询存储库: 这是一个相当复杂的模式。您可以在中找到关于存储库的好文章
还要检查是,这是存储库模式的正确实现。DAO模式通常也很有用,但是您的实现没有问题
DAO是一种将持久性逻辑与业务逻辑分离的简单模式。它将创建CRUD操作,而您的实体将包含用于业务逻辑的方法,因此它将持久性的责任从您的域中分离出来。对于单个实体和聚合存储库,我通常选择DAO,这样我就可以执行productCatalogRepository.Update()之类的操作,而这反过来又会迭代产品DAO并让它们自己存储起来。对我来说很不错。存储库是sql的正确位置。可能想看一下Doctrine2 ORM手册,了解一些想法。