Viv*_*ndi 6 php model-view-controller
我正在用PHP编写自己的MVC框架,仅用于学习目的.有一个路由器/调度程序类来调用正确的控制器/动作等并不是很难.
但现在我正处于我将要使用模型的部分.或者实际上是模型层.但有些东西让我感到困惑.
很多其他MVC框架都有一个'BaseModel'.我已经读到这实际上是不好的做法,因为"模型"不应该被视为另一个类.但作为一个真正的"层",可以包含"映射器"模式或"存储库"模式等内容.
但说实话,我认为没有任何优势.对我来说,'BaseModel'类似乎是最快的方法,结果相同.
我可以简单地做一些事情:
class User extends BaseModel
{
// the GetUserBy* could easily be something that's handled by the
// BaseModel class, like in the Repo pattern.
public function getUserByName ( $name )
{
// no error handling of any kind, just for simplicity
return $this->db->exec("SELECT * FROM users WHERE name='".$name."'");
}
// $data = array
public function saveUser ( $data )
{
// Make sure no extra fields are added to the array
$user = array ( 'name' => $data['name'],
'address' => $data['address']);
$this->db->autoSave ( $user );
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我选择存储库模式,那么我必须创建以下内容:存储库实体DAO
实体具有聚合到其他存储库.所以基本上我是手动将我的整个数据库方案写出来对象......
最后,有什么区别??? 除了我可能只需使用BaseModel类就可以节省很多时间......
但为什么它仍然被认为是一件坏事?并不是repo模式解耦我的应用程序而不是我现在正在做的事情.因为对我来说,上面提到的那些模式似乎被高估了.它可能只适用于具有共享状态的应用程序; 在本地保存对象(在存储库中)并在以后提交它们.
这就是为什么我认为没人能真正回答这个问题......
但我仍然希望看到一个让我离开的体面答案:"啊......我在想什么......".但如果没有,那么我肯定我的情况是BaseModel根本不是坏事,而且大多数博客只是一群羊:-)
这并不是说回购模式比我现在所做的更多地解耦我的应用程序
您的应用程序与 SQL 数据库组件紧密耦合(实际上,它们充当您的映射器)。然而,尽管如此,您的设计更像是一个存储库,而不是Active Record方法(这可能是您提到的大多数博主所抱怨的)。
活动记录不仅封装数据,还封装数据库访问:
$user = new User();
$user->setUsername('jane');
$user->setEmail('jane@foo.bar');
$user->save();
Run Code Online (Sandbox Code Playgroud)
让记录对象不知道持久层(关注点分离)会更好。您的“base”通过返回用户数据数组来实现这一点,当这些数组被修改时,它们必须传递回用户“base”进行保存。您可以将命名更改为:
class UserRepo extends BaseRepo
{
// user-specific repo code...
}
$userRepo = $this->getRepo('User');
$user = $userRepo->getUserByName('jane');
$user['email'] = 'jane@new.email';
$userRepo->save($user);
Run Code Online (Sandbox Code Playgroud)
拥有一个基础仓库并没有什么问题。