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

时间:2013-07-17 07:15:27

标签: php model-view-controller

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

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

2 个答案:

答案 0 :(得分:2)

从基础开始

  

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

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

  

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

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

  

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

Controler是模型和视图之间的代理。你得到params并根据这个params你设置适当的控制器动作。此操作应创建正确的模型对象,并使用它来获取数据,然后分配给视图。

我从未在模特中使用过单身。如果您需要一些可以帮助MVC结构的类,您可以使用帮助程序,并且Hast建议注册表模式。我不喜欢使用单身人士。

您可能还想查看When to use singleton

所以你的问题。

  • 控制器 - > model =通过模型方法的参数传递数据
  • 型号 - > controler =如果引用那么只需要处理它,如果参数然后执行某些操作并返回结果
  • 控制器 - > view =分配要查看的正确数据。
  • 查看 - > controller =转到特殊网址来制作数据或使用ajax请求来检索它。

答案 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课程时,你必须通过模型。