gpt4 book ai didi

php - 面向对象的 PHP 和 MVC : calling a method from another controller?

转载 作者:搜寻专家 更新时间:2023-10-31 20:43:24 25 4
gpt4 key购买 nike

这可能是由于我对 PHP 面向对象模型的理解存在差距,但请耐心等待,看看您是否发现它有任何意义/任何明显的错误。无论如何,在 MVC 应用程序中我有两个 Controller ,Post.phpThread.php。在 Thread Controller 中,我有一个 public 方法 mark_as_read(),它的功能与您猜想的一样。它将线程标记为已读(在数据库中插入行)或更新数据库中最后一个 View 的时间。在 Thread Controller 中,我可以通过以下方式轻松调用它:

$this->mark_as_read($user_id, $thread_id);

但是,在 Post Controller 中,我还希望能够将线程标记为已读,特别是当我发布新帖子并且我不希望数据库反射(reflect)用户尚未阅读时'阅读他们自己的"new"帖子。 第一个问题:如何从 post Controller 调用线程上的 mark_as_read() 方法?

无论如何,我本能地以一种对我来说似乎非常糟糕的方式解决了这个问题。有一个 Base Controller ,PostThread Controller 都继承自该 Controller 。我将 mark_as_read() 方法移动到基本 Controller 中,现在我可以通过调用相同的方法将线程标记为已读:

$this->mark_as_read($user_id, $thread_id);

来自任何 Controller !这对我来说真的很糟糕的原因是因为我有其他 Controller ,我不确定我是否真的想将线程标记为已读,并且本能地感觉它不属于那里。我很确定我做错了......所以问题二:我如何以“正确”的方式做到这一点?我正在使用 Laravel 3 ( http://laravel.com/ ) 但这似乎是一个一般的 OO PHP 问题,而不是特定于框架的。

最佳答案

我要问的第一个问题是:*mark_as_read(*) 应该属于哪个类?

MVC 模式允许您分离层: Controller 负责组织工作,它将大部分实际操作委托(delegate)给 View (显示 东西)和模型(任何数据库或数据结构相关的东西)。

这就是为什么,恕我直言,*mark_as_read()* 应该是 Thread model 类的一个方法。 Controller 应仅在其操作中调用 $myThread->mark_as_read()

因此,

  1. 任何 Controller 都可以轻松地将线程标记为已读,只要他有可用的线程 模型 实例。
  2. 任何帖子都可以轻松地将其线程标记为已读,因为我猜 Post 模型对象有一些指向其父线程的指针(模拟数据库帖子表中的外键关系)<

关于php - 面向对象的 PHP 和 MVC : calling a method from another controller?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17103075/

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