作者:老王
今天使用
CakePHP遇到了几个问题,记录下来,免得遗忘。
---------------------------------------
我想在CakePHP程序里利用循环多次添加一些Model,结果总是出错,后来发现在循环里多次save()应该在每次save()后 $this->model->id = false; 才行,不然CakePHP就认为你是在Update,而不是Insert了。
---------------------------------------
保存一个Model有如下两种方式:
1. $this->model->save($this->data);
2. $this->model->create($this->data); $this->model->save();
两种方式本质上差不多,但是第一种方式TableDataGateway的味道浓一些,而第二种方式的ActiveRecord的味道更重,哈哈,不过这些都属于
程序员的意淫范围了,不提也罢。
---------------------------------------
CakePHP对Insert/Update的数据会自动进行单引号的转义处理,但是Select的数据有时候需要自己搞定,具体什么时候后面会介绍,如果需要自己搞定的话,可以使用CakePHP本身提供的sanitize来做,至于sanitize的加载方式,我觉得不应该直接new,而是放在AppModel中比较好,如下:
class AppModel extends Model
{
function & getCoreInstance($name)
{
static $instance = array();
if(! array_key_exists($name, $instance))
{
uses($name);
$instance['name'] = & new $name;
}
return $instance['name'];
}
}
这样,我们就可以在Model里利用 $sanitize = $this->getCoreInstance('sanitize'); 来加载sanitize对象了,之所以选择这样的方式,是因为这样的话,我们可以在测试的时候Mock掉相应的对象,使代码更具有可测试性。
注意:对于SELECT,情况比较特殊,有时候需要直接处理单引号,有时候CAKEPHP会帮我们处理,如下:
$this->find("name = '{$name}'") 如果是这样的情况,就需要我们自己处理。
$this->find(array('name' => $name)) 如果是这样的情况,CakePHP会帮我们处理。
这样看来,find方法的conditions参数,还是使用数组形式比较好。
---------------------------------------
CakePHP缺省会发送一个P3P头:
CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
具体什么意思我还得查查才知道。
---------------------------------------
findAllThreaded方法不错:
http://bakery.cakephp.org/articles/view/threaded-lists