在MVC中设置存储库模式

w00*_*w00 10 php oop design-patterns ddd-repositories repository-pattern

我试图弄清楚Repository模式如何工作以及如何在自定义MVC模式中实现它.

据我所知,Repository是一个简单地从实体类返回数据或将实体类保存到持久层的层.

现在我现在看到它是这样的:

请求进入我的控制器以创建用户.只是一个用户名和密码.我的控制器将执行以下操作:

function CreateAction ( )
{
    $userRepo = new userRepository ( );
    $user = new userEntity ( );

    $user->setUsername('user');
    $user->setPassword('123456');

    $userRepo->create($user);
}
Run Code Online (Sandbox Code Playgroud)

然后我的userRepository类看起来像这样:

class userRepository
{
    public function create ( User $user )
    {
        $this->db->exec ( "INSERT INTO ... QUERY TO SAVE THE USER" );
    }
}
Run Code Online (Sandbox Code Playgroud)

我的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我认为第一件事是错误的是我在存储库类中使用了一个查询.我在哪里实际将userEntity类保存到数据库?换句话说,我在哪里执行实际的SQL查询?我想正确的方法是在存储库的'create'方法中调用DAO.但我仍然试图弄清楚DAO的真实外观以及与MVC模式中的模型相比有多么不同.

但除此之外,这是实现存储库模式的正确方法吗?

Gor*_*don 12

您的存储库对我来说看起来更像是TableDataGateway.存储库的想法是在映射层之上的另一层,它在域对象和数据库之间进行调解.它还可以作为域对象的内存存储(您的示例中缺少某些内容),并且可以封装Factory以创建新实体.它们通常还允许按规范模式查询存储库:

POEAA的存储库序列图

这是一个相当复杂的模式.你可以在里面找到关于Repository的好文章

还要检查Good Domain Driven Design示例