这可能是由于我对PHP面向对象模型的理解存在差距,但请耐心等待,看看您是否发现它有任何意义/任何明显的错误。无论如何,在MVC应用程序中,我有两个控制器,Post.php
和Thread.php
。在Thread
控制器中,我有一个public
方法mark_as_read()
,它可以猜到。它将线程标记为已读(在数据库中插入行)或更新数据库中最后一个视图的时间。在Thread
控制器中,我可以通过以下操作轻松地调用它:
$this->mark_as_read($user_id, $thread_id);
然而,在Post
控制器中,我也希望能够将线程标记为已读,特别是当我发布新帖子时,我不希望数据库反映用户没有阅读他们自己的"新"帖子。第一个问题:我如何从后控制器调用线程上的mark_as_read()
方法?
无论如何,我用一种直觉认为非常不好的方法来修补和解决这个问题。有一个Base
控制器,Post
和Thread
控制器都继承自它。我将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实例可用,任何控制器都可以很容易地将线程标记为已读。
- 任何post都可以很容易地将其线程标记为已读,因为我猜 post 模型对象有一些指向其父线程的指针(模拟数据库post表中的外键关系)