MVC,什么去哪里

时间:2013-01-01 02:55:24

标签: php model-view-controller

目前,我有一个胖控制器和一个更薄的模型层。

我的控制器看起来像这样。

namespace controller;
class home
{


    public $template = 'home';

    protected $database;

    public function __construct(\Zend\Db\Adapter\Adapter $database){
        $this->database = $database;

    }

    /**
     * Returns the home page
     */
    public function indexView(){


        $userService = new UserService($this->database);
        $view = new ViewModel($this->template);
        $view->assign('pageTitle', 'Home');
        $view->assign('lead', "Welcome ".$userService->getFirstName());
        $view->assign('h1', 'Home');


    }
}

我的模型包括数据处理,数据收集等。

这个调用的viewModel类,视图,基本上是一个容器类,包括页眉,页脚和里面使用的实际模板。

就MVC而言,我现在明白模型和视图是相互了解的。

我能以正确的方式解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

MVC模式有很多变化,包括MVP(模型视图演示者),你看的每个地方都可以用不同的方式解释。

通常常见的一件事是模型应该完全不知道控制器或视图。这允许根据需要交换模型。模型不需要任何模型。

相反,使用observer pattern,其中模型是可观察的,控制器和/或视图是观察者。当模型中的某些内容发生变化时,它会调用其观察者的更新/通知方法,并通知它已更改。

一种变体是管理视图的supervising controller,但不会干扰事件等:

  

如示例所示,良好的监督控制器的本质是尽可能少。让视图尽可能地处理,只有在涉及更复杂的逻辑时才进入。

最后,就PHP而言,请检查此helpful answer指向使用CodeIgniter MVC。如果您正在查看其他Web框架,Yii Framework似乎也可以很好地覆盖MVC。

答案 1 :(得分:0)

简短回答:不,你没有采用正确的方式,甚至是稍微正确的方式。

MVC设计模式全是separation of concerns。您将模型层与表示层分开 - 将域业务逻辑与其演示方式分开。

在表示层中,您将负责用户交互(控制器)的组件与管理UI创建(视图)的组件分开。

  

模型层也会受到一些分离,尽管通常没有在“mvc for beginners by beginners”博客文章中介绍。我在之前的帖子中写了short description。但是如果你想真正了解如何实现模型层,你必须阅读Folwer的PoEAA

在经典的MVC(你不能用于web)和Model2 MVC模式中, view 从模型层请求它需要的所有数据。控制器仅通过将用户输入应用于它们来更改模型层和当前视图的状态。

在其他受MVC启发的设计模式(MVVM和MVP)的最简单实现中,类似控制器的结构(分别是ViewModel和Presenter)为视图提供了来自模型层的数据。这也意味着在控制器内部拥有一个视图模型毫无意义。您可以在this publication中阅读有关MVP模式的更多信息。

  

P.S。另外,为什么要在控制器中注入数据库连接时才能将它传递给它?该代码片段违反了LoD。如果你需要从控制器内的模型层获取结构,你应该注入一个工厂。