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 中的模型应该实现为单例吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章