gpt4 book ai didi

php - PHP MVC 中的 BaseModel,好还是坏?

转载 作者:可可西里 更新时间:2023-11-01 13:28:38 25 4
gpt4 key购买 nike

我正在用 PHP 编写自己的 MVC 框架,仅用于学习目的。让路由器/调度程序类调用正确的 Controller /操作等并不难。

但是现在我要使用模型了。或者实际上,模型层。但有些事情让我感到困惑。

许多其他 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 );
}
}

但是如果我要使用存储库模式,那么我必须创建以下内容:资料库实体道

实体具有到其他存储库的聚合。所以基本上我是手动将我的整个数据库方案写到对象...

到底有什么区别???除了我可能可以通过简单地使用 BaseModel 类来节省很多时间......

但为什么它仍然被认为是一件坏事呢??并不是说 repo 模式比我现在做的更多地解耦我的应用程序。因为对我来说,上面提到的那些模式似乎被高估了。它可能只适用于具有共享状态的应用程序;将对象保存在本地(在存储库中)并稍后提交。

这就是为什么我认为没有人能真正回答这个问题......

但我仍然希望看到一个像样的答案让我离开:“啊啊……我在想什么……”。但如果不是,那么我确信我的情况是 BaseModel 根本不是一件坏事,而且大多数博主只是一群绵羊:-)

最佳答案

It's not that the repo pattern decouples my application more then i'm doing now

您的应用程序与 SQL 数据库组件(实际上充当您的映射器)紧密耦合。然而,尽管如此,您的设计更像是一个Repository。比 Active Record方法(这可能是您提到的大多数博主所提示的)。

事件记录不仅封装了数据,还封装了数据库访问:

$user = new User();
$user->setUsername('jane');
$user->setEmail('jane@foo.bar');
$user->save();

最好让记录对象不知道持久层(关注点分离)。你的“基地”通过返回用户数据数组来做到这一点,当这些数组被修改时,它们必须传回用户“基地”以进行保存。您可以将命名更改为:

class UserRepo extends BaseRepo
{
// user-specific repo code...
}

$userRepo = $this->getRepo('User');
$user = $userRepo->getUserByName('jane');
$user['email'] = 'jane@new.email';
$userRepo->save($user);

有一个基础 repo 没有错。

关于php - PHP MVC 中的 BaseModel,好还是坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10283592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com