— 文章所属小组: CakePHP
CakePHP应用开发 第四章 控制器——编写应用的控制逻辑(1)
  • 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 的新文件,向里面添加如下代码.

<?php
class BooksController extends AppController {
var $name = 'Books';
var $uses = array();
function index() {
//nothing's here
}
}
?>

3,在 /app/views/目录里面创建一个名为books的文件夹,进入该文件夹,并创建一个名为 index.ctp 的文件,文件里面的代码如下:

<h2>Packt Book Store</h2>
<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 赋予一组模型名称。然后在控制器中,我们就可以使用这些模型类了。

"规则优于设置“是CakePHP框架的主要哲学之一。首先推荐遵循控制器和模型的命 名规则,让Cake自行将对应的控制器和模型关联起来。这可以让事情变得更简单。”

我们已经了解了第二种手动绑定的方法是如何实现的。我们给BooksController 的$uses属性赋一个空值,告诉Cake这个控制器不需要任何模型类。我们也可使使用该属性为单个控制器绑定多个的模型。要实现这点,我们只要将模型名 称添加到给$uses属性里面即可。

$uses = array ( 'ModelName1', 'ModelName2' ) ;

我们已经知道如何将控制器与模型绑定起来。接下来我们会了解如何使用控制器与视图互动。


上一篇|目录|下一篇

填写登录信息
用户名
密码