在理想世界中,不应该依赖单例,控制器中的模型和视图内的模型将是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();
}
}
如何在控制器模型和视图模型之间共享数据?
答案 0 :(得分:2)
从基础开始
视图从模型请求为用户生成输出表示所需的信息。
这意味着视图应该只负责显示信息。只是为了那个。你也可以做一些诸如修剪,修改文本大小等的事情,但你不应该在那里做一些计数或更复杂的操作。
模型会在其状态发生变化时通知其关联的视图和控制器。此通知允许视图生成更新的输出,控制器可以更改可用的命令集。
模型应该负责进行数据操作。例如,您可以使用它从数据库中获取记录。它只负责数据处理。
控制器可以向其关联视图发送命令以更改视图的模型呈现(例如,通过滚动文档)。它还可以向模型发送命令以更新模型的状态(例如,编辑文档)。
Controler是模型和视图之间的代理。你得到params并根据这个params你设置适当的控制器动作。此操作应创建正确的模型对象,并使用它来获取数据,然后分配给视图。
我从未在模特中使用过单身。如果您需要一些可以帮助MVC结构的类,您可以使用帮助程序,并且Hast建议注册表模式。我不喜欢使用单身人士。
您可能还想查看When to use singleton
所以你的问题。
答案 1 :(得分:0)
您可以改用注册表或依赖注入。
同样在某些情况下,您可以将一些数据作为数组传递给视图类。像这样:
class MyView extends View {
private $data = array();
public function __construct($data)
{
$this->data = $data;
}
public function users() {
return $this->data['model']->getUsers();
}
}
当你从你的控制器(或你打电话的任何地方)调用View
课程时,你必须通过模型。