发新话题
打印

今天使用Cakephp的时候遇到的几个问题

今天使用Cakephp的时候遇到的几个问题

作者:老王

今天使用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

TOP

TOP

TOP

TOP

cake1.2分页助手的例子:http://bin.cakephp.org/saved/18241

TOP

发新话题