1

在理想的世界中,不应依赖单例,控制器中的模型和视图中的模型将是 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();
    }
  }

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

4

2 回答 2

2

从基础开始

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

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

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

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

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

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

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

您可能还想查看何时使用单例

所以你的问题。

  • 控制器 -> 模型 = 通过模型方法的参数传递数据
  • Model -> controler = If reference then just work on it, if argument then do something and return result
  • 控制器 -> 视图 = 分配要查看的适当数据。
  • View->controller = 转到特殊的 url 来制作数据或使用 ajax 请求来检索它。
于 2013-07-17T07:29:48.077 回答
0

您可以改用注册表依赖项注入

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

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

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

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

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

于 2013-07-17T07:22:28.653 回答