recess----3.Controller如何和View关联

上一篇我们讲到,Recess框架里面的controller就是一个典型的MVC框架的controller,它负责处理从浏览器(或其它客户端)过来的request,然后调用引用model里面的方法来进行运算,最后选择合适的view来产生response,然后把response发回给客户端。这里我们开始了解Controller和View到底是怎样的关系。

 

1、决定使用哪一个view 

事实上,目前为止,我们例程的controller里面已经有了两个method:index和printIt。而这两个method一个是有view的,另外一个没有。printIt比较特殊,我们在这里添加了exit,它就没有再继续执行了,所以,可以暂时放一边不用管;或者我们觉得没必要使用view的时候,可以这么处理。

我们着重介绍index的view,index.html.php

<html>
<header>
<title>Great Works!</title>
</header><body>
<p>Hello Friends,</p>
<p>Message from controller:<?php echo $message; ?></p>
<p>Great Works! You build your first APP in Recess successfully!</p>
<p><strong><a href="http://www.cnblogs.com/pied">Luo Zhenxing</a></strong>
<br />(<a href="mailto:piedgogo@gmail.com">e-mail</a>)</p>
</body>
</html>

重要规则:controller负责指定由哪一个view来响应,如果没有指定的话,会自动去该controller的/view目录下寻找nameOfTheControllerMethod.html.php。例如,我们的function index中并没有指定view,那么,recess默认回去找index.html.php。如果还没有找到,则会抛出错误

我们的例程里面已经展示使用默认的view,那如何指定使用哪一个view?如下,使用ok方法:

class HelloWorldController extends Controller {  
  
    function printIt() {  
        return $this->ok('the-view');  
    }  
  
} 

使用return $this->ok()这一方法,成功的告诉recess,我们准备用/view/home/the-view.php来作为该方法的返回页面。具体可以自行编辑文件尝试。

 

2、传递变量到view

回顾我们的第一个app,index方法只作了一件事,给公共变量message赋值:

 $this->message = 'Hello Recess!';

我们在index.html.php里面有取用这一变量:

 <?php echo $message; ?> 

当然,不管有多少个变量,取用方法都是一样的。事实上,在controller里面声明的公共变量,会被copy到Response object里面去,进而被传给view。这一过程有点“备忘录模型”(memento)的影子。

这里,作者还提供了一个方便我们调试的方法,即,在view中使用fail方法,来强行生成一个诊断页面,没错,就是那个你前面遇到过的黄黄绿绿的页面。在这里产生诊断页面,它会把当前view可用的变量全部打印出来。如此方便我们编写view。具体可参考下面:

<html>  
    <head><title>Hello World View</title></head>  
    <body>  
        <?php echo $fail; ?>  
    </body>  
</html> 

页面上的context table就是我们想要看到的了。

 

3、关于response object

controller method可以不用返回任何东西,或者是返回一个response object。当我们不返回任何东西的时候,就像前面描述的那样,默认认为该controller method返回了一个ok response,并且,这一ok response使用和该controller method同名的一个view template。

response object需要产生一系列应答http request需要的信息,包括:response code, 要传递给view的数据, response需要的header, cookies, request的一个reference, 还有recess需要的一些meta data。具体的,controller的抽象类会帮你处理好这一切。

例如,ok方法对应的就是 “HTTP 200 OK”这一response code。其它的还包括:conflict, redirect, forwardOk, forwardNotFound, created, unauthorized等。‘forward’和‘created’属于比较特殊的response。

posted @ 2014-02-10 17:02  Biiigfish  阅读(777)  评论(0编辑  收藏  举报