cakephp知識點總結

高洛峰
發布: 2023-03-06 07:04:01
原創
1245 人瀏覽過

本文實例總結了cakephp常見知識點。分享給大家參考,具體如下:

1. 呼叫其他控制器的模板,重定向

方法一:

在此呼叫/views/tasks/tasks下的hello.ctp模板

$this -> viewPath = 'tasks';
$this -> render('hello');
登入後複製

方法二(帶參):

$this ->redirect(array('controller'=>'users','action'=>'welcome',urlencode($this->data['姓名'].'haha')));

2. 查詢

直接使用sql:

$this->PostContent->query("select * from user");
find():
$clue = $this->clue->find('all',
  array(
    'fields' =>array(
      'id',
      'title',
      'content'
    ),
    'order' => 'id ASC',
    'conditions' => array('id' => '1'),
  )
);
登入後複製

find的參數,第一個可以是all、first、count,第二個參數為一數組,數組的key可以是:conditions、fields、order、limit、offset、joins。

新增:

$this->clue->create();
$this->clue->save($this->data);
登入後複製
登入後複製

修改:

$this->clue->create();
$this->clue->save($this->data);
登入後複製
登入後複製

刪除:

$this->clue->delete($id)
登入後複製

3. 不需要公共樣式時

$this->layout = false;
登入後複製

不用渲染任何view

$this->autoRender = false;
登入後複製

4.定義公共的方法/類別

##方法一:

可以在/app/Controller/AppController.php中定義公共的方法

呼叫

#
$this->test();
登入後複製

方法二:

在/app/controllers/components中建立UtillComponent.php

#
<?php
  class UtillComponent extends Object
  {
   function juanstr ($str) {
     return $str.&#39;+juanstr&#39;;
   }
  }
?>
登入後複製

##呼叫:

var $components = array(&#39;Utill&#39;);
$digit1 = $this->Utill->juanstr($digit1);
登入後複製

5.定義提示訊息

$this->Session->setFlash(__(&#39;The user has been saved&#39;));

<p class="wrong"><?php echo $this->Session->flash();?></p>
登入後複製

##
$this->Session->write(&#39;Message.auth&#39;,array(&#39;message&#39;=>__(&#39;The user has been saved.&#39;,true),&#39;element&#39;=>&#39;&#39;,&#39;params&#39;=>array()));

<p class="wrong"><?php echo $this->Session->flash(&#39;auth&#39;);?></p>
登入後複製

6. session設定

可參考:http://www.php.cn/

check(string $name);

檢查Session中是否已有$name為鍵值的資料項目.<br/>#del(string $name);

delete(string $name);

刪除$name 指定的Session 變數。

valid當Session有效時回傳true,最好在read()操作前用它來決定你要存取的會話是否確實有效.

read(string $name) ;

傳回$name 變數值。

renew

透過建立新的seesion ID,刪除原有的ID,將原有Session中資訊更新到新的Session中。

write(string $name, mixed $value);

#將變數$name,$value寫入會話.

error

傳回最近由Cake Session Component 產生的錯誤,常用於偵錯。

7. 表單

<?php echo $this->Form->create(&#39;Subject&#39;,array(
  &#39;type&#39; => &#39;post&#39;,
  &#39;inputDefaults&#39;=>array(
    &#39;p&#39;=>false,
    &#39;label&#39;=>false
    ),
  &#39;url&#39;=>array(
      &#39;controller&#39;=>&#39;subjects&#39;,
      &#39;action&#39;=>&#39;edit&#39;
    ),
  &#39;onsubmit&#39;=>&#39;return validateCallback(this, dialogAjaxDone);&#39; //提交前验证
  )
);
echo $this->Form->input(&#39;id&#39;,array(&#39;type&#39;=>&#39;hidden&#39;));
echo $this->Form->input(&#39;uid&#39;,array(&#39;type&#39;=>&#39;hidden&#39;));
?>
<ul class="usr_info_basic">
<li>
  <p class="ti">下拉单选(编辑页面会自动判断选中)</p>
  <p class="ce">
<?php echo $this->Form->input(&#39;type&#39;,array(&#39;type&#39;=>&#39;select&#39; ,&#39;class&#39;=>&#39;ipt&#39;,&#39;options&#39; => array(0=>&#39;文章&#39;,1=>&#39;专题&#39;, 2=>&#39;图组&#39;)));?>
  </p>
</li>
<li>
  <p class="ti">多选</p>
  <p class="ce">
<?php
  echo $this->Form->input(&#39;pushtype&#39;, array(&#39;type&#39;=>&#39;select&#39;,
    &#39;options&#39; => $pushtype,//所有选项
    &#39;multiple&#39;=>&#39;checkbox&#39;,
    &#39;selected&#39; => $pushtypes,//选中的项
));
?>
  </p>
</li>
</ul>
<p class="btns_3">
  <button class="btn3" type="submit"><span>保存</span></button>
  <button class="btn3 btn3_1 close"><span>取消</span></button>
</p>
<?php echo $this->Form->end();?>
登入後複製

#8. 日誌$this->log();

在controller直接呼叫:

$this->log(&#39;Something brok2&#39;,LOG_DEBUG);
登入後複製

#或view裡呼叫:

登入後複製

日誌的類型大致上有以下幾種:

$levels = array(
  LOG_WARNING=> &#39;warning&#39;,
  LOG_NOTICE=> &#39;notice&#39;,
  LOG_INFO=> &#39;info&#39;,
  LOG_DEBUG=> &#39;debug&#39;,
  LOG_ERR=> &#39;error&#39;,
  LOG_ERROR=> &#39;error&#39;
);
登入後複製

#日誌檔案都保存在/app/tmp/logs目錄。

在/app/config/core.php檔案中有日誌的設定選項:

#
define(&#39;LOG_ERROR&#39;, 2);
登入後複製

9.渲染路徑

echo APP . &#39;webroot&#39; . DS;
//D:\wamp\www\cakephp\app\webroot\
echo APP . &#39;webroot&#39; ;
D:\wamp\www\cakephp\app\webroot
登入後複製

附:CakePHP必知的21個技巧

這篇文章可以說是CakePHP教學中最經典的了。雖然不是完整的手把手系列,但作者將自己使用CakePHP的經驗總結了21條,這些尤其是對新手十分有用。

翻譯時故意保留了一些CakePHP中特有的字沒有翻譯,如controller、model等。相信學過CakePHP的人應該馬上就能理解它們的意思吧。

另外,CakePHP的wiki已經失效,取而代之的是一個名為bakery的網站。原文中引用的wiki的連結也都已更新到了bakery上。

快速建立靜態頁面

我想建立幾個頁面,它們只包含靜態數據,使用預設layout,不需要任何model。最初我試圖創建一個controller並為每個靜態頁面定義一個action。但這種方法很笨拙,也不適合快速建立靜態頁面。

實際上只要使用pages controller就可以做到——只要在 views/pages 資料夾下建立一個view,就可以透過 /pages 來存取。例如,我創建了 /views/pages/matt.thtml ,就可以透過http://www.php.cn/ 來存取。

改變靜態頁面的標題

使用pages controller時如果想改變頁面標題,只需在view中加入以下程式碼:

<? $this->pageTitle = &#39;Title of your page.&#39;; ?>
登入後複製

在靜態頁面中向layout發送資料

#如果需要向layout傳遞資料(例如表示導覽列中哪個部分應該會高亮顯示的變數),可以在view中加入下面的程式碼:

<? $this->_viewVars[&#39;somedata&#39;] = array(&#39;some&#39;,&#39;data&#39;); ?>
登入後複製

#這個陣列就可以在layout中透過$somedata來存取。

快速建立後台管理

如果你需要建立後台管理程序,並且希望所有管理action都位於某個特定資料夾下,那麼開啟config/core. php 並將下面這一行的註解去掉:

define(&#39;CAKE_ADMIN&#39;, &#39;admin&#39;);
登入後複製
######

这样所有以"admin_"开头的action都可以通过 /admin/yourcontroller/youraction 来访问。例如,如果在posts controller中创建了名为"admin_add"的action,那么可以通过 www.example.com/admin/posts/add 访问这个action。这样就可以方便地为admin目录设置密码以避免他人随意访问。

查看后台执行的SQL语句

只需改变config/core.php中的DEBUG常量,即可看到后台执行的SQL语句。0为产品级,1为开发级,2为完整调试SQL,3为完整调试SQL并显示对象数据。我通常将DEBUG设置为2,这样每页的底部会显示出一个包含SQL调试信息的表格。

如果页面底部添加的表格会破坏页面布局(特别是使用Ajax获取页面并显示到页面中间而不是底部时),你可以在CSS中添加以下代码以隐藏调试信息:

#cakeSqlLog { display: none; }
登入後複製

这样既能保持页面布局,又可以通过查看源代码来看到调试信息。当然最后发布网站时别忘了将调试级别改回0。

获取丰富的开发文档

别总是盯着手册。wiki和API也是无价之宝。wiki中的开发指南十分有用,而API文档初看起来比较难,但你很快就会发现这里的信息对你创建CakePHP网站十分重要。

使用bake.php

Bake是个命令行PHP脚本,可以根据数据库自动生成model、controller和view。在开发的最初阶段,我强烈推荐使用scaffolding让你的原型程序跑起来。但如果你清楚地知道scaffolding不合适,我推荐你使用bake。bake会生成所有的文件并保存到磁盘上,以便你随意修改。这样能节省创建关联、view、基本的CRUD crollder操作的重复工作。

(译者注:CRUD - Create, Read, Update, Delete,数据库应用的四种基本操作,即"增删查改"。)

bake很方便。你只需在数据库中建立一个表,然后到 /cake/scripts/ 目录下执行php bake.php 即可。

如果你通过交互方式来运行bake,它会分几步提示你创建model、controller和view。创建结束之后,我通常会阅读所有生成的代码并做必要的修改。

发布程序时注意权限

有一次我在发布程序时,将整个cake目录打包然后用scp上传到了服务器上。只要一关闭调试信息,就会出现错误——数据库调用无法返回任何数据。我一筹莫展,因为我必须通过调试信息才能调试问题。后来有人告诉我,/app/tmp应当对apache可写。将权限改为777之后问题就解决了。

复杂model验证

我需要进行更复杂的验证,而不仅仅是验证输入框非空或者符合某个正则表达式这样的简单验证。例如,我要验证用户注册时使用的邮件地址是否已被使用。在wiki中我找到了这篇关于高级验证的文章,其中提到了一些十分有用的高级验证方法。

记录错误日志

$this->log(&#39;Something broke&#39;);
登入後複製

这样可以将错误记录到 /tmp/logs/ 中(我最初以为会记录到apache的错误日志中)。

让controller使用其他model

如果你的controller需要调用来自不同model的数据,只要在controller开头使用如下代码:

class yourController extends AppController {
 var $uses = array(&#39;Post&#39;,&#39;User&#39;);
}
登入後複製

这样controller就能访问Post和User model了。

创建不使用数据库表的model

我需要创建一个不使用任何表的model。例如,我想通过$validate数组方便底验证输入数据,保持model逻辑的正确性。但创建model时对应的表不存在,CakePHP就会报错。通过在model中加入以下代码可以解决这个问题:

var $useTable = false;
登入後複製

你也可以通过这种方法改变model对应的表名。

var $useTable = &#39;some_table&#39;;
登入後複製

重定向之后记得exit()

对于有经验的人来说这应当是理所当然的事儿,调用 $this->redirect() 之后,剩下的代码如果不想运行要exit()。我也这样做,但以前曾经认为 $this->redirect() 会为我调用exit(实际上不会)。

高级model函数

翻翻API就能发现很多你不知道的非常有用的函数。我强烈推荐至少阅读一遍 Model 类的参考手册。下面是以前我没注意到的几个重要函数:

generateList() - 主要用于生成选择框(