【发布时间】:2023-03-11 04:01:01
【问题描述】:
这可能是由于我对 PHP 面向对象模型的理解存在差距,但请耐心等待,看看您是否发现它有任何意义/任何明显的错误。无论如何,在 MVC 应用程序中,我有两个控制器,Post.php 和 Thread.php。在Thread 控制器中,我有一个public 方法mark_as_read(),正如您所猜测的那样。它将线程标记为已读(在 DB 中插入行)或更新数据库中最后一个视图的时间。在Thread 控制器中,我可以通过以下方式轻松调用它:
$this->mark_as_read($user_id, $thread_id);
但是,在Post 控制器中,我还希望能够将线程标记为已读,特别是当我发布新帖子并且我不希望数据库反映用户尚未阅读他们自己的帖子时“最新帖子。 第一个问题:如何在 post 控制器的线程上调用 mark_as_read() 方法?
无论如何,我本能地以一种对我来说非常不好的方式修补并解决了这个问题。有一个 Base 控制器,Post 和 Thread 控制器都继承自该控制器。我将mark_as_read() 方法移到基本控制器中,现在我可以通过调用相同的方法将线程标记为已读:
$this->mark_as_read($user_id, $thread_id);
来自任何控制器!这对我来说似乎真的很糟糕的原因是因为我有其他控制器我不确定我是否真的想将线程标记为已读,并且本能地感觉它不属于那里。我很确定我做错了......所以问题二:我该如何以“正确”的方式做到这一点?我正在使用 Laravel 3 (http://laravel.com/) 但这似乎是一个通用的 OO PHP 问题,并非特定于框架。
【问题讨论】:
-
如果我能回答任何澄清问题,请随时问...
-
我还认为我可以将方法设为静态......但那样的解决方案会不会更丑陋?
-
mark_as_read 应该是线程上的模型动作,而不是控制器上
-
@Orangepill 现在正在尝试……对我来说很有意义。
-
感谢大家的帮助!
标签: php class oop model-view-controller controller