PHP:MVC 中的模型应该实现为单例吗? [复制]

Posted

技术标签:

【中文标题】PHP:MVC 中的模型应该实现为单例吗? [复制]【英文标题】:PHP: Should a Model in MVC be implemented as singleton? [duplicate] 【发布时间】:2013-07-15 15:13:01 【问题描述】:

在理想的世界中,不应依赖单例,控制器中的模型和视图中的模型将是 2 个不同的实例。当控制器设置状态并且视图呈现取决于该状态时,就会出现问题。例如:

  class MyController extends Controller 

    public function __construct(ModelUsers $cModel)
    
      $this->model = $cModel;
    

    public function action_Search($username) 
      $this->model->filterByUsername($username);
    
  

  class MyView extends View 

    public function __construct(ModelUsers $vModel)
    
      $this->model = $vModel;
    

    public function users() 
      return $this->model->getUsers();
    
  

如何在控制器模型和视图模型之间共享数据?

【问题讨论】:

为什么单身不好? 它不是一个“模型”。模型是层,层不能是单例。同样,没有控制器模型或视图模型。有关详细信息,请参阅***.com/questions/3499336/…。 @Virus721 因为***.com/questions/4595964/who-needs-singletons/… @Virus721 Singleton 被称为反模式的原因有很多。它们隐藏了对象的生命周期,它们隐藏了依赖关系。他们控制着违反 SRP 的生命周期。确实有很多原因。 @Virus721 这根本没有意义。您的代码应该具有完成工作所需的确切内容。而已。一点也不差。单例用于执行 奇异性 提供全局访问,您的示例不需要这样做。因此,如果它不是约束,请不要添加它。请参阅上面链接的我的答案以及其中的所有链接。 【参考方案1】:

从基础开始

视图向模型请求生成输出表示给用户所需的信息。

这意味着视图应该只负责显示信息。就为了那个。你也可以做一些事情,比如修剪、改变文本大小等,但你不应该在那里做一些计数或更复杂的操作。

模型在其状态发生变化时通知其关联的视图和控制器。此通知允许视图生成更新的输出,并允许控制器更改可用的命令集。

模型应该负责做数据操作。例如,您可以使用它从数据库中获取记录。它只负责数据处理。

控制器可以向其关联视图发送命令以更改视图对模型的表示(例如,通过滚动文档)。它还可以向模型发送命令以更新模型的状态(例如,编辑文档)。

控制器是模型和视图之间的代理。您到达那里的参数并根据此参数设置控制器的正确操作。此操作应创建正确的模型对象并使用它来获取数据然后分配给视图。

我从未在模型中使用过单例。如果你需要一些有助于 MVC 结构的类,你可以使用 helpers 和 Hast 建议的 Registry 模式。我不喜欢使用单例。

你可能还想看看When to use singleton

所以你的问题。

控制器 -> 模型 = 通过模型方法的参数传递数据 Model -> controler = 如果是引用,那么就对其进行处理,如果是参数,则执行某些操作并返回结果 控制器 -> 视图 = 分配要查看的适当数据。 View->controller = 去特殊的 url 做数据或使用 ajax 请求来检索它。

【讨论】:

【参考方案2】:

您可以改用Registry依赖注入

此外,在某些情况下,您可能会将一些数据作为数组传递给您的视图类。像这样:

  class MyView extends View 
    private $data = array();

    public function __construct($data)
    
        $this->data = $data;
    

    public function users() 
      return $this->data['model']->getUsers();
    
  

当然,当您从控制器(或您拨打电话的任何地方)调用 View 类时,您必须传递模型。

【讨论】:

以上是关于PHP:MVC 中的模型应该实现为单例吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

片段作为 Android 中的单例

静态类是单例吗? [复制]

我应该使用单例吗?

注入 Guice 的 DAO 应该是单例吗?

我应该为我的视图控制器使用单例吗?

我正在用 Swift 编写 iOS 应用程序。我应该使用单例吗?