尝试CakePHP的bake功能。
先安装一个能运行的CakePHP,然后把相应的路径添加到
系统的PATH环境
变量里去(比如:C:\Program Files\Apache Group\Apache2\htdocs\cake\cake\console),然后,在命令行(cmd)里进入相应的工作目录(比如:C:\Program Files\Apache Group\Apache2\htdocs\cake\app),就可以使用bake功能来生成代码了。具体命令是:cake bake,然后会有简单的提示,你只要对着做就可以了。
使用bake来生成常用功能。
最简单的方法是使用脚手架方式,当你bake控制器的时候,系统会先问“Would you like bake to build your controller interactively?”,选择是,然后系统问“Would you like to use scaffolding?”,你只要回答是就搞定了。不过这样的脚手架是动态的,我们没法修改程序和
模板,如果你想生成实实在在的代码,以bake控制器为例:当系统问“Would you like bake to build your controller interactively?”的时候,选择否(也可以选择是,然后在系统问“Would you like to use scaffolding? ”时再选择否就可以了),然后系统会接着问“Would you like to include some basic class methods (index(), add(), view(), edit())? ”,这时候选择是,就会生成实实在在的
控制器代码了,相应的视图代码bake方法雷同。通过看这些bake出来的代码,也可以加深我们对cakephp用法的了解,代码片段如下:
复制内容到剪贴板
代码:
function add() {
if (!empty($this->data)) {
$this->cleanUpFields();
$this->model->create();
if ($this->model->save($this->data)) {
$this->Session->setFlash('The model has been saved');
$this->redirect(array('action'=>'index'), null, true);
} else {
$this->Session->setFlash('The model could not be saved. Please, try again.');
}
}
}(后面还会用到这段代码说明几个问题)
CakePHP控制器里的cleanUpFields方法。
在上面bake出来的控制器代码中,我们看到了一个cleanUpFields方法,它是什么用处呢?要说起它的作用,还要牵扯出来
form视图
助手,当我们使用form视图助手去生成一些和时间有关的代码时,比如说使用form视图助手的year(),month(),hour(),dateTime()等方法时,视图助手会生成一些诸如“$fieldName . "_year"”之类的input名字,通过cleanUpFields方法,就可以计算出$fieldName应该是什么时间,并且删除“$fieldName . "_year"”之类的变量。
CakePHP代码中潜在的安全问题。
在bake控制器代码的时候,我们看到add()方法里的代码流程大致是这样的:
复制内容到剪贴板
代码:
$this->model->create();
if ($this->model->save($this->data)) {
// ..
}通过查看CakePHP源代码,可以发现在save的时候,存在注入的危险,用户可以通过给表单注入一个id字段,使add方法实际执行的是类似edit的动作。具体原因参考如下链接(
一,
二)。