0

MVC 对我来说是一个相当新的概念,我刚刚发现自己在做一些我不太确定是否会被认为是“好习惯”的事情。

我有一个处理所有用户相关操作的控制器User(从 扩展)。CUserController在这个控制器中,我actionLogin处理登录请求。现在在登录过程中,我需要根据情况显示3个不同的页面:

  • 登录表单(输入用户名/密码)。
  • 错误消息(如果用户详细信息匹配但帐户被标记为被阻止)。
  • 登录成功页面(如果有新消息与帐户相关联)。

到目前为止,我已经这样处理它:

public function actionLogin(){
    ... perform some operations ...
    ... determine which page to display and set $scenario accordingly ...
    $this->render('login',array(
        'scenario'=>$scenario
    ));
}

然后在login.php(视图文件)中:

... perform some common operations ...
switch($scenario){
    case "login":
        ...display login...
        break;
    case "error":
        ... display error ...
        break;
    .. etc. ...
}

现在这使我的视图文件实际上显示了完全不同的页面(尽管密切相关)。

将我的视图拆分为不同的页面(例如login-form.php, login-error.php, login-success.php)并根据情况呈现不同的页面会更好,actionLogin还是我目前做的处理这个的好方法?

4

2 回答 2

4

最好的选择是尝试修复 Yii 对 MVC 设计模式的解释,我喜欢称之为 ORM-Template-Adapter 模式。

您的问题源于这样一个事实,即在适当的 MVC 启发结构中,视图应该是对象,负责所有表示逻辑并且每个都能够管理多个模板。

Yii 真正努力实现的 MVC 变体是 MVP:model-view-presenter。显着的区别在于 MVP 中的 View 是被动的(这不是“哑模板”的同义词)。你应该坚持下去。

我建议创建一个处理身份验证表示的类。并有 4 个模板:

  • 布局 - 基本的东西,不会改变的 html 部分
  • 登录 - 表单
  • 错误-好吧..猜猜它的作用
  • 成功

然后您的新的和改进的视图将根据来自User 控制器 演示者的输入来决定要组合哪些模板。

...或者您将更多的演示逻辑冷推到您的User“控制器”上。

于 2012-07-16T23:25:07.573 回答
1

我认为您试图在 MVC 比赛中不使用 MVC。为什么?actionLogin 只是动作登录。如果您需要一个错误页面(...如果您需要...),您可以创建 actionError()。但我不明白为什么。通常错误会显示在登录页面的消息中。将视图视为视图(仅 html、css、js)。将模型视为数据(数组、查询结果)。并将控制器视为一个获取视图并使用某些数据源渲染它的人。停止。您需要包含特定数据的特定视图吗?好吧:只需创建该视图,获取该数据。最后但同样重要的是,为您的混搭创建您自己的控制器。

于 2012-07-16T23:25:36.870 回答