脚手架

2.5 版后已移除: 动态脚手架将在 3.0 版本中去掉并被替换。

应用程序脚手架是这样一种技术,它允许开发者定义并且创建基本的应用程序,能够创建、读取、更新和删除对象。CakePHP 的脚手架还允许开发者定义对象之间如何关联,以及如何建立或断开这些连接。

创建脚手架只需要一个模型和它的控制器。一旦在控制器中设置了 $scaffold 变量,就可以运行了。

CakePHP 的脚手架相当酷。它可以让你在几分种内就建立起一个基本的 CRUD 应用程序。它甚至酷到你想在生产环境的应用程序中使用它。的确,我们也认为它很酷,但是请意识到脚手架……毕竟……只是脚手架。脚手架是在项目的初期为了启动而快速搭建的一种松散结构。它并不是要十分灵活,只是让你能够开始进行项目的一种临时方式。如果你发现你确实要定制逻辑或视图,那就应当推翻脚手架,开始写自己的代码。下一节介绍的 CakePHP 的 Bake控制台是下一步的绝佳选择:它生成所有的代码,可以产生与大部分脚手架相同的结果。

脚手架是编写 web 应用程序初始部分的一个很好的方法。早期的数据库结构随时会变更,这在设计过程的初期是完全正常的。其负面影响是:web 开发人员痛恨编写永远不会实际用到的表单。为了减轻开发人员的这种愤愤不平,CakePHP 中加入了脚手架。脚手架分析数据库表,并且建立带有添加、删除和编辑按钮的标准列表,编辑数据库中单条记录的标准表单,查看数据库中单条记录的标准视图。

要将脚手架添加到应用程序中,只要在控制器中加入 $scaffold 变量:

  1. class CategoriesController extends AppController {
  2. public $scaffold;
  3. }

假设你已经建立了最基本的 Category 模型类文件(位于 /app/Model/Category.php 中),那么脚手架已经可以用了。要查看你的新脚手架,请访问 http://example.com/categories

注解

在使用脚手架的控制器中新建方法可能带来不想要的结果。例如,(如果你在脚手架控制器中建立了 index() 方法),你的 index 方法将被渲染,而脚手架功能则不会被渲染。

脚手架知道模型的关联,所以,如果你的 Category 模型 belongsTo (属于) User 模型,你将会在 Category 的列表中看到关联的 User ID。尽管脚手架“知道”模型间的关系,但是直到你在模型中手动添加关联代码,你才能在脚手架视图中看到关联的记录。例如,如果Group hasMany User (组包含很多用户),并且 User belongsTo Group (用户也属于组),你必须在 User 和 Group 模型中手动添加如下代码。在你添加这些代码之前,视图将在 New User 表单中显示空的 Group 下拉列表框;在你加入这些代码之后,视图将在 NewUser 表单中显示来自 Group 表的 ID 或者名字构成的下拉列表:

  1. // 在 Group.php 中
  2. // In Group.php
  3. public $hasMany = 'User';
  4. // 在 User.php 中
  5. // In User.php
  6. public $belongsTo = 'Group';

如果你想看到除了 ID 外更多的东西(例如用户的姓),你可以在模型中设置$displayField 变量。让我们在 User 类中设置 $displayField 变量,以便在脚手架中显示关联到 category 的用户的姓,而不只是 ID。这个特点使脚手架在许多情况下可读性更强:

  1. class User extends AppModel {
  2. public $displayField = 'first_name';
  3. }

使用脚手架建立一个简单的管理界面

如果你已经在 app/Config/core.php 中用Configure::write('Routing.prefixes', array('admin')); 设置了允许管理路由(admin routing),就可以使用脚手架生成一个管理界面。

一旦你允许了管理路由,只要将管理前缀赋给脚手架变量:

  1. public $scaffold = 'admin';

现在你就可以访问管理的脚手架动作:

  1. http://example.com/admin/controller/index
  2. http://example.com/admin/controller/view
  3. http://example.com/admin/controller/edit
  4. http://example.com/admin/controller/add
  5. http://example.com/admin/controller/delete

这种方法能够很快地建立一个简单的后台界面。切记,不能同时使用脚手架搭建的管理和非管理两类方法。如同正常脚手架一样,你可以重载个别方法,用自己的方法代替:

  1. public function admin_view($id = null) {
  2. // custom code here
  3. }

一旦你替换了脚手架搭建的动作,你还需要为这个动作创建视图文件。

定制脚手架视图

如果你想在你的脚手架视图中使用一些不一样的东西,可以创建模板。虽然我们仍然不推荐把这种技术用于生产环境的应用程序,不过在原型迭代阶段这种定制也许还是有用的。

用于某个控制器的定制脚手架视图(这里以 PostsController 为例)应该位于:

  1. app/View/Posts/scaffold.index.ctp
  2. app/View/Posts/scaffold.form.ctp
  3. app/View/Posts/scaffold.view.ctp

用于所有控制器的定制脚手架视图应该位于:

  1. app/View/Scaffolds/index.ctp
  2. app/View/Scaffolds/form.ctp
  3. app/View/Scaffolds/view.ctp