脚手架
2.5 版后已移除: 动态脚手架将在 3.0 版本中去掉并被替换。
应用程序脚手架是这样一种技术,它允许开发者定义并且创建基本的应用程序,能够创建、读取、更新和删除对象。CakePHP 的脚手架还允许开发者定义对象之间如何关联,以及如何建立或断开这些连接。
创建脚手架只需要一个模型和它的控制器。一旦在控制器中设置了 $scaffold 变量,就可以运行了。
CakePHP 的脚手架相当酷。它可以让你在几分种内就建立起一个基本的 CRUD 应用程序。它甚至酷到你想在生产环境的应用程序中使用它。的确,我们也认为它很酷,但是请意识到脚手架……毕竟……只是脚手架。脚手架是在项目的初期为了启动而快速搭建的一种松散结构。它并不是要十分灵活,只是让你能够开始进行项目的一种临时方式。如果你发现你确实要定制逻辑或视图,那就应当推翻脚手架,开始写自己的代码。下一节介绍的 CakePHP 的 Bake控制台是下一步的绝佳选择:它生成所有的代码,可以产生与大部分脚手架相同的结果。
脚手架是编写 web 应用程序初始部分的一个很好的方法。早期的数据库结构随时会变更,这在设计过程的初期是完全正常的。其负面影响是:web 开发人员痛恨编写永远不会实际用到的表单。为了减轻开发人员的这种愤愤不平,CakePHP 中加入了脚手架。脚手架分析数据库表,并且建立带有添加、删除和编辑按钮的标准列表,编辑数据库中单条记录的标准表单,查看数据库中单条记录的标准视图。
要将脚手架添加到应用程序中,只要在控制器中加入 $scaffold
变量:
- class CategoriesController extends AppController {
- public $scaffold;
- }
假设你已经建立了最基本的 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 或者名字构成的下拉列表:
- // 在 Group.php 中
- // In Group.php
- public $hasMany = 'User';
- // 在 User.php 中
- // In User.php
- public $belongsTo = 'Group';
如果你想看到除了 ID 外更多的东西(例如用户的姓),你可以在模型中设置$displayField
变量。让我们在 User 类中设置 $displayField
变量,以便在脚手架中显示关联到 category 的用户的姓,而不只是 ID。这个特点使脚手架在许多情况下可读性更强:
- class User extends AppModel {
- public $displayField = 'first_name';
- }
使用脚手架建立一个简单的管理界面
如果你已经在 app/Config/core.php
中用Configure::write('Routing.prefixes', array('admin'));
设置了允许管理路由(admin routing),就可以使用脚手架生成一个管理界面。
一旦你允许了管理路由,只要将管理前缀赋给脚手架变量:
- public $scaffold = 'admin';
现在你就可以访问管理的脚手架动作:
- http://example.com/admin/controller/index
- http://example.com/admin/controller/view
- http://example.com/admin/controller/edit
- http://example.com/admin/controller/add
- http://example.com/admin/controller/delete
这种方法能够很快地建立一个简单的后台界面。切记,不能同时使用脚手架搭建的管理和非管理两类方法。如同正常脚手架一样,你可以重载个别方法,用自己的方法代替:
- public function admin_view($id = null) {
- // custom code here
- }
一旦你替换了脚手架搭建的动作,你还需要为这个动作创建视图文件。
定制脚手架视图
如果你想在你的脚手架视图中使用一些不一样的东西,可以创建模板。虽然我们仍然不推荐把这种技术用于生产环境的应用程序,不过在原型迭代阶段这种定制也许还是有用的。
用于某个控制器的定制脚手架视图(这里以 PostsController 为例)应该位于:
- app/View/Posts/scaffold.index.ctp
- app/View/Posts/scaffold.form.ctp
- app/View/Posts/scaffold.view.ctp
用于所有控制器的定制脚手架视图应该位于:
- app/View/Scaffolds/index.ctp
- app/View/Scaffolds/form.ctp
- app/View/Scaffolds/view.ctp