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
中呈现不同的观点,或者是我目前做了什么好处理这个?
答案 0 :(得分:4)
最好的选择是尝试修复对MVC设计模式的Yii解释,我喜欢称之为ORM-Template-Adapter模式。
你的问题源于这样一个事实:在适当的MVC启发结构中, Views 应该是对象,负责所有表示逻辑,并且每个都能够管理多个模板。
Yii实际努力实现的MVC变体是MVP:model-view-presenter。显着的区别在于MVP中的View是被动的(这与“哑模板”不同义)。你应该坚持下去。
我建议创建一个处理身份验证表示的类。并有4个模板:
然后,您的新视图和改进视图将根据User
控制器 演示者的输入决定要合并的模板。
...或者你将更多的演示逻辑推到你的User
“控制器上”。
答案 1 :(得分:1)
我认为你试图在MVC比赛中不使用MVC。为什么? actionLogin只是动作登录。如果你需要一个错误页面(......如果你需要......),你可以创建actionError()。但我不明白为什么。通常错误显示在消息的登录页面中。将视图视为视图(仅限html,css,js)。将模型视为数据(数组,查询结果)。并将控制器视为一个人,可以通过一些数据源来查看并呈现它。停止。您需要特定数据的特定视图吗?好吧:只需创建该视图,获取该数据。最后但同样重要的是,为您的mashup创建自己的控制器。