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

时间:2013-06-14 07:15:06

标签: php class oop model-view-controller controller

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

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

但是,在Post控制器中我还希望能够将一个线程标记为已读,特别是当我创建一个新帖子并且我不希望数据库反映用户没有读取时他们自己的“新”职位。 第一个问题:如何在帖子控制器的线程上调用mark_as_read()方法?

无论如何,我本能地以一种似乎非常对我不好的方式进行修补并解决了这个问题。 BasePost控制器都有一个Thread控制器。我将mark_as_read()方法移动到基本控制器中,现在我可以通过调用相同的方式将线程标记为已读:

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

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

1 个答案:

答案 0 :(得分:3)

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

MVC模式允许您分层:控制器负责组织作业,它将大多数实际操作委托给视图显示东西)以及模型(任何 db或数据结构相关的东西)。

这就是为什么,恕我直言,* mark_as_read()*应该是线程 模型类的方法。控制器只应在其操作中调用$myThread->mark_as_read()

因此,

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