OO PHP和MVC:从另一个控制器调用方法


OO PHP and MVC: calling a method from another controller?

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

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

然而,在Post控制器中,我也希望能够将线程标记为已读,特别是当我发布新帖子时,我不希望数据库反映用户没有阅读他们自己的"新"帖子。第一个问题:我如何从后控制器调用线程上的mark_as_read()方法?

无论如何,我用一种直觉认为非常不好的方法来修补和解决这个问题。有一个Base控制器,PostThread控制器都继承自它。我将mark_as_read()方法移动到基本控制器中,现在我可以通过调用相同的方法将线程标记为已读:

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

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

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

MVC模式允许分离层:控制器负责组织工作,它将大多数实际操作委托给视图 (显示的东西)和模型(任何db或数据结构相关的东西)。这就是为什么,IMHO, *mark_as_read()*应该是Threadmodel类的方法。控制器应该只在其动作中调用$myThread->mark_as_read()

,

    只要有 thread model实例可用,任何控制器都可以很容易地将线程标记为已读。
  1. 任何post都可以很容易地将其线程标记为已读,因为我猜 post 模型对象有一些指向其父线程的指针(模拟数据库post表中的外键关系)