3

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

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

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

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

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

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

4

1 回答 1

3

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

MVC 模式允许您分离层:控制器负责组织工作,它将大部分实际操作委托给视图显示内容)和模型(任何与数据库或数据结构相关的内容)。

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

因此,

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