【问题标题】:OO PHP and MVC: calling a method from another controller?OO PHP 和 MVC:从另一个控制器调用方法?
【发布时间】:2023-03-11 04:01:01
【问题描述】:

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

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

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

无论如何,我本能地以一种对我来说非常不好的方式修补并解决了这个问题。有一个 Base 控制器,PostThread 控制器都继承自该控制器。我将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


【解决方案1】:

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

MVC 模式允许您分离层:控制器负责组织工作,它将大部分实际操作委托给 viewdisplay 东西)和 model (任何 db 或数据结构 相关的东西)。

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

因此,

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

【讨论】:

  • 好的,所以我将它添加到模型中......那我应该怎么称呼它?假设 $thread 是适当的线程对象。 $thread->mark_as_read($user_id, $thread_id);?
  • 应该可以省略thread_id,除非实例有身份危机
  • 啊,说得好。正如我写的那样,它需要 2 个参数 $user_id$thread_id 但如果我在线程模型中有它,我可以传递用户 ID 并将线程 ID 设置为 $this->id?
  • 此外,如果帖子和线程不共享祖先或子关系,但它们共享相同的 mark_as_read 行为,则可能值得创建一个单独的 ReadMarker 类来抽象行为
  • 好电话。在这种情况下,只有线程可以“标记为已读”,但我可以考虑扩展应用程序并希望现在就这样做......
猜你喜欢
  • 1970-01-01
  • 2015-10-02
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
相关资源
最近更新 更多