- Moon.Wong
- 评论(0)
4
控 制器:编写应用程序的逻辑
控制器,跟它名字的表面意思很契合——它所起的作用是控制,督导,和管理。在 CakePHP中,控制器是用来处理浏览器请求和方便模型与视图之间通信的类。它是定义应用程序逻辑的中枢之地,浏览器请求的控制处理流程就是在此定义 的。
在CakePHP中,控制器的每一个公共方法(public method )都被称作操作。每个操作都代表一个地址链接。当浏览器发送一个地址链接请求时,就会调用相应的控制器操作。控制器通常会使用模型类来操作和处理用户数 据。一般数据处理完毕,控制器将数据从模型中提出来,然后将它转发到合适的视图文件中去。然后视图文件会被作为响应返回给浏览器,并在浏览器中显示出来。 如此,控制器就在用户,模型和视图三者中间起到协调作用 。
在这一章节,我们将学习CakePHP控制器的基本要点,尤其是下面这些内容:
1,如何在控制器中实现与模型类互动。
2,如何将控制器中的数据传送到视图中去
3,如何创建控制器操作以及使给操作传输参数。
4,如何获取视图表单中的数据。
5,如何转跳到另一个操作
6,如何为所有控制器添加一个常用的功能
7,如何创建可重复用的部件,以便让我们给控制器添加功能。
与模型互动
多数情况,一个控制器只负责一个模型的逻辑处理。在第三章,我们已经见识了CakePHP 是如何根据控制器的名称自动找到相应的模型的。对应的模型类自动跟控制器关联起来,我们可以在控制器中访问模型——我们无需在模型类中做特别的设置。在前 一章节,我们看到了这种自动绑定的一个实例。我们创建了Tasks控制器,CakePHP就自动将 对应的模型Task与控制器绑定起来。我们可以在Tasks控制器中访问Task模型,就好像模型类只是控制器的一个属性 ($this->Task)。
绑定模型和控制器
在CakePHP中,所有控制器一般都有一个独立的模型类。CakePHP设计的使用方式 就是这样的。CakePHP总是会依据命名规则为每一个控制器寻找一个对应的模型类,除非在控制器中对此另有明确的定义。在某些特殊的情形之下,我们的一 个控制器可能没有任何对应的模型类。这时,我们必须手动设置控制器去来应对这种情况。接下来,让我们看看如何创建这种没有对应模型的控制器:
动手时间:创建无模型的控制器
1,复制一份新的CakePHP到你的网页根目录下。将文件夹命名为applogic。
2,在 /app/controllers/目录下创建一个名为books_controller.php 的新文件,向里面添加如下代码.
var $uses = array();
function index() {
}
3,在 /app/views/目录里面创建一个名为books的文件夹,进入该文件夹,并创建一个名为 index.ctp 的文件,文件里面的代码如下:
<p>Coming Soon!</p>
4,现在,访问后面这个连接,在浏览器里面查看劳动成果http://localhost /applogic/books/
怎么回事?
首先,我们创建了一个新的CakePHP工程。我们在第二章中已经知道了如何创建和配置一 个新的Cake工程。在这里,因为我们无需数据库,因此,我们也就没有创建数据库的配置文件(app/config/database.php)。 Cake无法找到任何数据库的配置文件,但是它还是可以正常工作的。
然后,我们创建了一个名为BooksController的控制器类。在这个控制器中,我 们定义了一个名为$uses的属性。 $uses 这个属性是Cake用来定义控制器对应模型类的名称的。如果 $uses 没有定义的话,Cake会根据命名规则来寻找对应的模型类。在例子中,我们给控制器中的$uses 属性设置的是一个空数组。这意味着BooksController不用使用任何模型类。我们可以像下面这样将空值设置给$uses 。
var $uses = array();
然后,我们在BooksController的里面创建了一个名为index的操作。然后 我们也为这个操作创建了对应的视图文件(app/books/index.ctp)。
index()中还没有代码。因此,当执行这个操作时,Cake只是简单的调用相应的视图 文件
但有人访问这个连接 http://localhost/applogic/books/时,BooksController默认的操作(这里就是index())就会调用, 相应的视图文件就会显示出来。在浏览器中效果如下。
在CakePHP中,我们有两种方式可以将控制器和模型关联起来。
1,自动绑定:CakePHP会通过默认的命名规则将模型跟控制器绑定起来。比如,名为 BooksController控制器会自动与一个名为Book的模型绑定起。
2,手动绑定:如果你想要覆盖掉自动绑定,我们可以给控制器的属性$uses 赋予一组模型名称。然后在控制器中,我们就可以使用这些模型类了。
我们已经了解了第二种手动绑定的方法是如何实现的。我们给BooksController 的$uses属性赋一个空值,告诉Cake这个控制器不需要任何模型类。我们也可使使用该属性为单个控制器绑定多个的模型。要实现这点,我们只要将模型名 称添加到给$uses属性里面即可。
$uses = array ( 'ModelName1', 'ModelName2' ) ;
我们已经知道如何将控制器与模型绑定起来。接下来我们会了解如何使用控制器与视图互动。