Yii Design - 如何拆分View逻辑?

时间:2012-07-16 23:02:24

标签: php templates yii

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.phplogin-error.phplogin-success.php),并根据情况在actionLogin中呈现不同的观点,或者是我目前做了什么好处理这个?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

  • 布局 - 基本内容,不会改变的html部分
  • 登录 - 表单
  • 错误 - 好吧......猜猜它做什么
  • 成功

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

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

答案 1 :(得分:1)

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