php - MVC : Having static method in models

标签 php model-view-controller model static

简洁:如何避免在模型中使用静态方法?

Loquacious:假设我有一个用户类别。有了 userID,我可以通过 (new user($userID))->getUserName() 获取用户名。好吧,如果我想查找用户怎么办? (new user())->lookup($uname, $pass)。仍然可以,但后一种情况可以通过一个简单的静态方法user::lookup($uname, $pass)来完成!
一些想法:

  • 没关系!随时使用 (new object())->method() 。那么我应该创建一个空心对象来调用函数吗?
  • 将此函数移出您的模型。如果需要数据库查找,哪里比模型上下文更好?
  • 将其定义为静态方法。那么在类中混合使用公共(public)方法和静态方法不是很糟糕吗?

旁注:我搜索过这个问题,没有结果!

最佳答案

将此函数移出您的模型。如果需要数据库查找,哪里比模型上下文更好?

是的,确实,这是解决问题的最好方法。

目前,您的 User 类违反了单一责任原则,该原则基本上表示“一个任务 - 一个类”。

现在,您的用户描述了用户实体/状态并处理持久性(在您的情况下 - 从数据库检索)。看,有两件事。

我建议您创建另一个类来处理持久性任务,例如添加/更新/删除用户。最简单的解决方案是创建一个原始存储库,如下所示:

<?php
class UserRepository
{
    public function addUser(User $user);

    public function updateUser(User $user);

    public function deleteUser(User $user);

    public function getUserById($id);
}

然后可以通过以下方式检索用户:

// get an instance of this repository class
$userRepository  = new UserRepository;

// ask it to find and return user from the database by ID
$user = $userRepository->getUserById($_GET['id']);

易于阅读,易于操作,对吗?

这个UserRepository类实际上是Repository Pattern的原始实现。 UserRepository 模拟所有用户的内存集合,将实现隐藏在内部。它对您作为用户隐藏了实际的持久性机制:想象一下,您的同事会编写这个类,而您只是使用它的方法,例如 UserRepository::getById(1) -你甚至不知道/关心它是否从文件/数据库/API 中获取数据。那很整齐。 )

Kristopher Wilson 的《The Clean Architecture in PHP》一书非常清楚地描述了这个特定的实现,我强烈推荐您阅读这本书:它将花费您两到三个晚上的时间,并将您推向一个新的水平。

你可以扩展方法列表,当然,添加查找等。

class UserRepository
{
    public function getByCompany(Company $company);

    public function getByEmail($email);

    public function countTotal();
}

事实上,每次您需要在数据库中获取/添加/更新用户时,您都应该通过此存储库来完成。

我想强调,这是该模式的一个简单实现,特别是如果您将它与 Martin Fowler describes as Repository 进行比较。 。不过,在大多数情况下,这是完全没问题的。

关于php - MVC : Having static method in models,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39923318/

相关文章:

php - 从数组下载文件 Laravel 中的输出不正确

model - 无法从吊索模型获取/设置数据

ruby-on-rails - 我应该将我的数据库查询测试放在 Rails 中的什么位置?

php - 如何使用 PHP 从我自己的网站上的 Google Drive 获取文件和文件夹列表?

PHP fopen 给出间歇性错误无法打开流 : No space left on device

javascript - jQuery代码仅在第一个div点击时播放声音

php - 没有紧凑结构的 MVC 应用程序的原因是什么?

php - PHP 的 MVC 方法中的 Hello World 示例

jquery - MVC 中的下拉列表框可以触发一个事件,以便我可以填充另一个事件吗?

ruby-on-rails-3 - Rails 3 中 View 中的记录分组?