時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
這篇文章可以說(shuō)是CakePHP 教程中最經(jīng)典的了。雖然不是完整的手把手系列, 但作者將自己使用CakePHP 的經(jīng)驗(yàn)總結(jié)了21條,這些尤其是對(duì)新手十分有用。
翻譯時(shí)故意保留了一些CakePHP 中特有的詞語(yǔ)沒(méi)有翻譯, 如controller、model等。相信學(xué)過(guò)CakePHP 的人應(yīng)該馬上就能理解它們的意思吧。
另外,CakePHP 的wiki已經(jīng)失效,取而代之的是一個(gè)名為bakery的網(wǎng)站。 原文中引用的wiki的鏈接也都已更新到了bakery上。
快速創(chuàng)建靜態(tài)頁(yè)面
我想建立幾個(gè)頁(yè)面,它們僅包含靜態(tài)數(shù)據(jù),使用默認(rèn)layout,不需要任何model。 最初我試圖創(chuàng)建一個(gè)controller并為每個(gè)靜態(tài)頁(yè)面定義一個(gè)action。 但這種方法很笨拙,也不適合快速創(chuàng)建靜態(tài)頁(yè)面。
實(shí)際上只要使用pages controller就可以做到——只要在 views/pages 文件夾下創(chuàng)建一個(gè) view,就可以通過(guò) /pages 來(lái)訪問(wèn)。例如,我創(chuàng)建了 /views/pages/matt.thtml , 就可以通過(guò) http://www.example.com/pages/matt 來(lái)訪問(wèn)。
改變靜態(tài)頁(yè)面的標(biāo)題
使用pages controller時(shí)如果想改變頁(yè)面標(biāo)題,只需在view中加入以下代碼:
pageTitle = 'Title of your page.'; ?>
在靜態(tài)頁(yè)面中向layout發(fā)送數(shù)據(jù)
如果需要向layout傳遞數(shù)據(jù)(例如表示導(dǎo)航欄中哪個(gè)部分應(yīng)該高亮顯示的變量), 可以在view中添加下面的代碼:
_viewVars['somedata'] = array('some','data'); ?>
這個(gè)數(shù)組就可以在layout中通過(guò)$somedata來(lái)訪問(wèn)。
快速創(chuàng)建后臺(tái)管理
如果你需要?jiǎng)?chuàng)建后臺(tái)管理程序,并且希望所有管理action都位于某個(gè)特定文件夾下, 那么打開(kāi) config/core.php 并將下面這一行的注釋去掉:
define('CAKE_ADMIN', 'admin');
這樣所有以"admin_"開(kāi)頭的action都可以通過(guò) /admin/yourcontroller/youraction 來(lái)訪問(wèn)。例如,如果在posts controller中創(chuàng)建了名為"admin_add"的action, 那么可以通過(guò) www.example.com/admin/posts/add 訪問(wèn)這個(gè)action。這樣就可以方便地為admin目錄設(shè)置密碼以避免他人隨意訪問(wèn)。
查看后臺(tái)執(zhí)行的SQL語(yǔ)句
只需改變config/core.php中的DEBUG常量,即可看到后臺(tái)執(zhí)行的SQL語(yǔ)句。 0為產(chǎn)品級(jí),1為開(kāi)發(fā)級(jí),2為完整調(diào)試SQL,3為完整調(diào)試SQL并顯示對(duì)象數(shù)據(jù)。 我通常將DEBUG設(shè)置為2,這樣每頁(yè)的底部會(huì)顯示出一個(gè)包含SQL調(diào)試信息的表格。
如果頁(yè)面底部添加的表格會(huì)破壞頁(yè)面布局(特別是使用Ajax獲取頁(yè)面并顯示到頁(yè)面中間而不是底部時(shí)), 你可以在CSS中添加以下代碼以隱藏調(diào)試信息:
#cakeSqlLog { display: none; }
這樣既能保持頁(yè)面布局,又可以通過(guò)查看源代碼來(lái)看到調(diào)試信息。 當(dāng)然最后發(fā)布網(wǎng)站時(shí)別忘了將調(diào)試級(jí)別改回0。
獲取豐富的開(kāi)發(fā)文檔
別總是盯著手冊(cè)。wiki和API也是無(wú)價(jià)之寶。wiki中的開(kāi)發(fā)指南十分有用,而API文檔初看起來(lái)比較難, 但你很快就會(huì)發(fā)現(xiàn)這里的信息對(duì)你創(chuàng)建CakePHP 網(wǎng)站十分重要。`
使用bake.php
Bake是個(gè)命令行PHP腳本,可以根據(jù)數(shù)據(jù)庫(kù)自動(dòng)生成model、controller和view。在開(kāi)發(fā)的最初階段,我強(qiáng)烈推薦使用 scaffolding讓你的原型程序跑起來(lái)。但如果你清楚地知道scaffolding不合適,我推薦你使用bake。 bake會(huì)生成所有的文件并保存到磁盤上,以便你隨意修改。這樣能節(jié)省創(chuàng)建關(guān)聯(lián)、view、基本的CRUD crollder操作的重復(fù)工作。
(譯者注:CRUD - Create, Read, Update, Delete,數(shù)據(jù)庫(kù)應(yīng)用的四種基本操作,即"增刪查改"。)
bake很方便。你只需在數(shù)據(jù)庫(kù)中建立一個(gè)表,然后到 /cake/scripts/ 目錄下執(zhí)行 php bake.php 即可。
如果你通過(guò)交互方式來(lái)運(yùn)行bake,它會(huì)分幾步提示你創(chuàng)建model、controller和view。 創(chuàng)建結(jié)束之后,我通常會(huì)閱讀所有生成的代碼并做必要的修改。
發(fā)布程序時(shí)注意權(quán)限
有一次我在發(fā)布程序時(shí),將整個(gè)cake目錄打包然后用scp上傳到了服務(wù)器上。只要一關(guān)閉調(diào)試信息,就會(huì)出現(xiàn)錯(cuò)誤——數(shù)據(jù)庫(kù)調(diào)用無(wú)法返回任何數(shù)據(jù)。我一籌莫展,因?yàn)槲冶仨毻ㄟ^(guò)調(diào)試信息才能調(diào)試問(wèn)題。后來(lái)有人告訴我,/app/tmp應(yīng)當(dāng)對(duì)apache可寫(xiě)。將權(quán)限改為777之后問(wèn)題就解決了。
復(fù)雜model驗(yàn)證
我需要進(jìn)行更復(fù)雜的驗(yàn)證,而不僅僅是驗(yàn)證輸入框非空或者符合某個(gè)正則表達(dá)式這樣的簡(jiǎn)單驗(yàn)證。 例如,我要驗(yàn)證用戶注冊(cè)時(shí)使用的郵件地址是否已被使用。在wiki中我找到了這篇 關(guān)于高級(jí)驗(yàn)證的文章, 其中提到了一些十分有用的高級(jí)驗(yàn)證方法。
記錄錯(cuò)誤日志
$this->log('Something broke');
這樣可以將錯(cuò)誤記錄到 /tmp/logs/ 中(我最初以為會(huì)記錄到apache的錯(cuò)誤日志中)。
讓controller使用其他model
如果你的controller需要調(diào)用來(lái)自不同model的數(shù)據(jù),只要在controller開(kāi)頭使用如下代碼:
class yourController extends AppController {
var $uses = array('Post','User');
}
這樣controller就能訪問(wèn)Post和User model了。
創(chuàng)建不使用數(shù)據(jù)庫(kù)表的model
我需要?jiǎng)?chuàng)建一個(gè)不使用任何表的model。例如,我想通過(guò)$validate數(shù)組方便底驗(yàn)證輸入數(shù)據(jù), 保持model邏輯的正確性。但創(chuàng)建model時(shí)對(duì)應(yīng)的表不存在,CakePHP 就會(huì)報(bào)錯(cuò)。 通過(guò)在model中加入以下代碼可以解決這個(gè)問(wèn)題:
var $useTable = false;
你也可以通過(guò)這種方法改變model對(duì)應(yīng)的表名。
var $useTable = 'some_table';
重定向之后記得exit()
對(duì)于有經(jīng)驗(yàn)的人來(lái)說(shuō)這應(yīng)當(dāng)是理所當(dāng)然的事兒,調(diào)用 $this->redirect() 之后,剩下的代碼如果不想運(yùn)行 要exit()。我也這樣做,但以前曾經(jīng)認(rèn)為 $this->redirect() 會(huì)為我調(diào)用exit(實(shí)際上不會(huì))。
高級(jí)model函數(shù)
翻翻API就能發(fā)現(xiàn)很多你不知道的非常有用的函數(shù)。 我強(qiáng)烈推薦至少閱讀一遍 Model 類的參考手冊(cè)。 下面是以前我沒(méi)注意到的幾個(gè)重要函數(shù):
* generateList() - 主要用于生成選擇框()所需的數(shù)據(jù)
* query() - 自己寫(xiě)SQL語(yǔ)句來(lái)查詢
* findCount() - 返回滿足指定條件的行數(shù)
* hasAny() - 當(dāng)有記錄滿足條件時(shí)返回真
再次強(qiáng)烈推薦閱讀整個(gè)model類參考,你會(huì)為你學(xué)到的東西贊嘆的。
如何正確插入多行
我需要遍歷一個(gè)列表,并將其中的每個(gè)元素都插入到數(shù)據(jù)庫(kù)中。 我發(fā)現(xiàn)如果在一次插入完成后立即進(jìn)行下一次插入, 那么第二次插入的內(nèi)容完全不會(huì)被插入,而是會(huì)被更新到第一次插入的行中。 例如:
$items = array('Item 1','Item 2','Item 3');
foreach ($items as $item) { $this->Post->save(array('Post' => array('title' => $item))); }
這段代碼將在posts表中插入僅一行:"Item 3"。 CakePHP 首先插入"Item 1",但馬上將其更新為"Item 2",再更新為"Item 3",因?yàn)?this->Post->id保存的是上一次插入成功的行的id。通常這個(gè)特性很有用,但在這個(gè)例子中反而幫了倒忙。其實(shí)只要在每次插入之后設(shè)置 $this->Post->id = false 就可以解決這個(gè)問(wèn)題。
更新:有人發(fā)郵件告訴我,正確的做法是調(diào)用create()初始化model,再set/save新數(shù)據(jù)。
在controller函數(shù)之前或之后插入邏輯
假設(shè)你需要在controller渲染的每個(gè)view中都設(shè)置一個(gè)顏色數(shù)組, 但你不希望在每個(gè)action中都定義它??梢酝ㄟ^(guò) beforeRender () 回調(diào)函數(shù)來(lái)實(shí)現(xiàn): function beforeRender () { $this->set('colors',array('red','blue','green'); } 這樣該controller渲染的所有view都可以訪問(wèn)$colors變量.beforeRender () 函數(shù)在controller邏輯結(jié)束后、view被渲染之前執(zhí)行。同樣, beforeFilter() 和afterFilter() 函數(shù)會(huì)在每個(gè)controller action執(zhí)行的前后執(zhí)行。 更多信息請(qǐng)閱讀手冊(cè)的models一節(jié)。
為CakePHP 添加所見(jiàn)即所得編輯器
這里有一篇非常好的教程教你如何在 CakePHP 中使用TinyMCE?;旧夏阒恍柙陧?yè)面上鏈接tiny_mce.js文件,然后添加一些初始化代碼以設(shè)置 將哪個(gè)textarea變成TinyMCE編輯器即可。
自定義HABTM關(guān)系的SQL語(yǔ)句
我曾試圖在自定義的SQL語(yǔ)句上定義一個(gè)HABTM關(guān)系(has-and-belongs-to-many),卻遇到了問(wèn)題。 根據(jù)本文撰稿時(shí)的文檔,應(yīng)當(dāng)先在自己的model中設(shè)置finderSql,但從CakePHP 的源代碼來(lái)看, 應(yīng)該設(shè)置finderQuery。這只是文檔中的一個(gè)小問(wèn)題,但指出問(wèn)題卻能為他人節(jié)約時(shí)間。 Trac ticket在這里?! “l(fā)送郵件 我在wiki中找到兩篇教程:發(fā)送郵件和 通過(guò)PHPMailer發(fā)送郵件。 強(qiáng)烈推薦后者,通過(guò)PHPMailer發(fā)送郵件更安全,而且不需要自己處理郵件頭,減少許多麻煩。
自定義Helper生成的HTML
我需要修改調(diào)用$html->selectTag()時(shí)生成的,使其生成"請(qǐng)選擇"選項(xiàng)來(lái)代替默認(rèn)的空白選項(xiàng)。 我也希望單選按鈕能帶有標(biāo)簽,這樣用戶就無(wú)需精確地點(diǎn)擊單選按鈕本身,而只需單擊到關(guān)聯(lián)的文字上即可。
建立 /app/config/tags.ini.php,然后添加以下的內(nèi)容:
; Tag template for a input type='radio' tag. radio = "%s"
; Tag template for an empty select option tag.
selectempty = "-- Please Select --"
你可以從/cake/config/tags.ini.php中獲得完整的標(biāo)簽列表。但我不建議修改該文件, 否則升級(jí)CakePHP 時(shí)
關(guān)鍵詞標(biāo)簽:CakePHP
相關(guān)閱讀
熱門文章 plsql developer怎么連接數(shù)據(jù)庫(kù)-plsql developer連接數(shù)據(jù)庫(kù)方法 2021年最好用的10款php開(kāi)發(fā)工具推薦 php利用淘寶IP庫(kù)獲取用戶ip地理位置 在 PHP 中使用命令行工具
人氣排行 詳解ucenter原理及第三方應(yīng)用程序整合思路、方法 plsql developer怎么連接數(shù)據(jù)庫(kù)-plsql developer連接數(shù)據(jù)庫(kù)方法 PHP中防止SQL注入攻擊 PHP會(huì)話Session的具體使用方法解析 PHP運(yùn)行出現(xiàn)Notice : Use of undefined constant 的解決辦法 PHP如何清空mySQL數(shù)據(jù)庫(kù) CakePHP程序員必須知道的21條技巧 PHP采集圖片實(shí)例(PHP采集)