0

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

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

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 方面,我现在明白模型和视图是相互了解的。

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

4

2 回答 2

2

MVC 模式有许多变体,包括 MVP(模型视图演示器),无论您在哪里看到,这些都可以略有不同的解释。

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

相反,使用观察者模式,模型是可观察的,控制器和/或视图是观察者。当模型中的某些内容发生更改时,它会为其观察者调用 update/notify 方法并通知他们它已更改。

一种变体是监督控制器,它管理视图但不干扰事件等:

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

最后,就 PHP 而言,检查这个有用的答案,它指向使用CodeIgniter MVC。如果您正在查看其他 Web 框架,Yii 框架似乎也很好地涵盖了 MVC。

于 2013-01-01T03:10:37.150 回答
0

简短的回答:不,您没有以正确的方式进行操作,甚至没有以稍微正确的方式进行。

MVC 设计模式都是关于关注点分离的。您将模型层与表示层分开 - 将域业务逻辑与其演示方式分开。

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

模型层也有一些分离,尽管“初学者的 mvc”博客文章中通常不涉及这一点。我在之前的一篇文章中写了一个简短的描述。但是,如果您想真正了解如何实现模型层,则必须阅读 Folwer 的PoEAA

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

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

PS还有,你为什么要在控制器中注入数据库连接,而你要做的只是传递它?该代码片段违反了LoD。如果您需要从控制器内的模型层获取结构,则应该注入工厂。

于 2013-01-01T11:10:07.573 回答