`
jqj031
  • 浏览: 73042 次
  • 性别: Icon_minigender_2
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

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.example.com/pages/matt 来访问。

改变静态页面的标题

使用pages controller时如果想改变页面标题,只需在view中加入以下代码:

<? $this->pageTitle = 'Title of your page.'; ?>

在静态页面中向layout发送数据


如果需要向layout传递数据(例如表示导航栏中哪个部分应该高亮显示的变量), 可以在view中添加下面的代码:

<? $this->_viewVars['somedata'] = array('some','data'); ?>

这个数组就可以在layout中通过$somedata来访问。

快速创建后台管理

如果你需要创建后台管理程序,并且希望所有管理action都位于某个特定文件夹下, 那么打开 config/core.php 并将下面这一行的注释去掉:

define('CAKE_ADMIN', 'admin');

这样所有以”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('Something broke');

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

让controller使用其他model

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

class yourController extends AppController {
  var $uses = array('Post','User');
}

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

创建不使用数据库表的model

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

var $useTable = false;

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

var $useTable = 'some_table';

重定向之后记得exit()

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

高级model函数

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

    * generateList() - 主要用于生成选择框(<SELECT>)所需的数据
    * query() - 自己写SQL语句来查询
    * findCount() - 返回满足指定条件的行数
    * hasAny() - 当有记录满足条件时返回真

再次强烈推荐阅读整个model类参考,你会为你学到的东西赞叹的。

如何正确插入多行


我需要遍历一个列表,并将其中的每个元素都插入到数据库中。 我发现如果在一次插入完成后立即进行下一次插入, 那么第二次插入的内容完全不会被插入,而是会被更新到第一次插入的行中。 例如:

$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”,因为$this->Post->id保存的是上一次插入成功的行的id。通常这个特性很有用,但在这个例子中反而帮了倒忙。 其实只要在每次插入之后设置 $this->Post->id = false 就可以解决这个问题。

更新:有人发邮件告诉我,正确的做法是调用create()初始化model,再set/save新数据。

在controller函数之前或之后插入逻辑

假设你需要在controller渲染的每个view中都设置一个颜色数组, 但你不希望在每个action中都定义它。可以通过 beforeRender() 回调函数来实现:

function beforeRender() {
  $this->set('colors',array('red','blue','green');
}

这样该controller渲染的所有view都可以访问$colors变量。 beforeRender() 函数在controller逻辑结束后、view被渲染之前执行。同样, beforeFilter() 和afterFilter() 函数会在每个controller action执行的前后执行。 更多信息请阅读手册的models一节。

为CakePHP添加所见即所得编辑器


这里有一篇非常好的教程教你如何在 CakePHP中使用TinyMCE。基本上你只需在页面上链接tiny_mce.js文件,然后添加一些初始化代码以设置 将哪个textarea变成TinyMCE编辑器即可。

自定义HABTM关系的SQL语句

我曾试图在自定义的SQL语句上定义一个HABTM关系(has-and-belongs-to-many),却遇到了问题。 根据本文撰稿时的文档,应当先在自己的model中设置finderSql,但从CakePHP的源代码来看, 应该设置finderQuery。这只是文档中的一个小问题,但指出问题却能为他人节约时间。 Trac ticket在这里。

发送邮件

我在wiki中找到两篇教程:发送邮件和 通过PHPMailer发送邮件。 强烈推荐后者,通过PHPMailer发送邮件更安全,而且不需要自己处理邮件头,减少许多麻烦。

自定义Helper生成的HTML

我需要修改调用$html->selectTag()时生成的<option>,使其生成“请选择”选项来代替默认的空白选项。 我也希望单选按钮能带有标签,这样用户就无需精确地点击单选按钮本身,而只需单击到关联的文字上即可。

建立 /app/config/tags.ini.php,然后添加以下的内容:

; Tag template for a input type='radio' tag.
radio = "<input type="radio" name="data[%s][%s]" id="%s" %s /><label for="%3$s">%s</label>"

; Tag template for an empty select option tag.
selectempty = "<option value="" %s>-- Please Select --</option>"

你可以从/cake/config/tags.ini.php中获得完整的标签列表。但我不建议修改该文件, 否则升级CakePHP时可能会让你的修改丢失。

自定义404页面

如果你需要自定义404页面,只需创建 /app/views/errors/error404.thtml。
分享到:
评论
1 楼 chenjing1121 2010-03-22  
你好,我从cakephp官网下了应用程序,解压后替换了原有的app目录,然后访问。出现了几个错误。好像是cache配置有错误。
Warning: Cache not configured properly. Please check Cache::config(); in APP/config/core.php in E:\wamp\www\cakephp\cake\libs\configure.php on line 663

Fatal error: Call to a member function connect() on a non-object in E:\wamp\www\cakephp\app\config\routes.php on line 37
请教如何解决这个错误。
cakphp的版本是1.2.2.8

相关推荐

    cakephp-1.2 manual

    通过阅读《CakePHP 1.2 手册》,开发者不仅能掌握该框架的基本用法,还能了解到最佳实践和高级技巧,从而提高开发效率和项目质量。虽然手册是英文版,但详细的解释和示例代码将有助于你无障碍地学习。在实际开发过程...

    PHP的框架之CakePHP-CakePHP教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;...CakePHP的使用技巧介绍;CakePHP开发的网站源码参考;CakePHP的中文资料很少,大部分是英文的,希望对大家有用,谢谢!

    cakephp 框架书籍 英文版

    - **博客教程**:本书籍通过一个博客项目的示例,引导读者逐步了解CakePHP框架的基本用法。这包括了如何设置环境、创建模型(Model)、控制器(Controller)以及视图(View)等基本组成部分。 - **添加层次**:博客教程的...

    PHP的框架之CakePHP-CakePHP教程终极教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;...CakePHP的使用技巧介绍;CakePHP开发的网站源码参考;CakePHP的中文资料很少,大部分是英文的,希望对大家有用,谢谢!

    cakephp 框架1.3.11版本

    - **chinaz.com.txt**:这个文件名暗示可能是一份从chinaz.com(站长之家)网站上获取的资料或者相关教程,可能包含了与 CakePHP 开发相关的技巧、最佳实践或者社区资源。 - **cakephp-cakephp-3b830a4**:看起来像...

    cakephp手册完整打印版

    《CakePHP手册完整打印版》是一份专为开发者准备的详尽参考资料,旨在帮助用户深入理解和熟练使用CakePHP框架。 CakePHP是一款基于Model-View-Controller(MVC)设计模式的开源PHP框架,它简化了Web应用开发过程,...

    cakephp-1.3.21.zip

    二、CakePHP 1.3.21特性 1. 数据验证:提供内置的验证规则,可轻松确保输入数据的有效性,减少程序错误。 2. 蛋糕式路由:自动映射URL到控制器方法,简化URL管理和路由配置。 3. 自动化 CRUD:支持快速创建、读取...

    cakephp-2.4.1

    在本文中,我们将深入探讨CakePHP 2.4.1版本的特点和使用技巧,帮助开发者更好地理解和应用这一强大的工具。 1. **MVC架构**:MVC是一种设计模式,将业务逻辑、数据和用户界面分离,使得代码更加清晰、易于维护。在...

    CakePHP中文手册

    **蛋糕PHP(CakePHP)**...通过深入学习这本**CakePHP中文手册**,开发者可以掌握使用CakePHP进行高效Web开发的技巧和最佳实践,从而提升开发效率和应用质量。无论是初学者还是经验丰富的开发者,都可以从中受益匪浅。

    CakePHP 3.5 开发手册文档 CakePHP Cookbook Documentation Release 3.5/共900页 PDF

    #### 一、CakePHP简介 **CakePHP** 是一个用 PHP 编写的快速、简洁的开发框架。它采用了 MVC (Model-View-Controller) 架构模式,旨在简化 Web 应用程序的开发流程,提供一套强大的工具集来帮助开发者更高效地构建...

    CakePHP视频教程(AVI格式)

    在本“**CakePHP视频教程(AVI格式)**”中,你可以通过一系列的教学视频深入理解框架的核心概念和实践技巧。这些视频可能涵盖了以下关键知识点: 1. **安装与环境配置**:教程可能会教你如何在你的开发环境中设置 ...

    cakephp官方文档

    ### CakePHP官方文档知识点概述 #### 一、Getting Started(开始使用) - **博客教程**:此部分提供了详细的博客应用程序构建教程,从零开始引导开发者完成一个完整的博客系统的开发过程。教程分为多个部分,其中...

    cakephp

    在安装并配置好环境后,下一步就是运行你的第一个CakePHP应用。这通常涉及到设置基本的路由、加载必要的库和配置文件。书中将指导读者通过一系列的步骤,从零开始创建一个简单的待办事项列表应用,包括创建数据库...

    cakephp手册

    CakePHP通过提供一个结构化的框架,使得开发者无需从零开始构建每个新项目,从而节省了大量的时间和精力。它内置了安全性特性,如SQL注入防护、跨站脚本(XSS)过滤等,确保应用程序的安全性。 ##### MVC模式的理解...

    CakePHP 1.2 电子书

    这个压缩包中的主要文件是“Super_Awesome_Advanced_CakePHP_Tips.pdf”,它提供了关于如何充分利用这个框架进行高效开发的高级技巧和实践指导。 CakePHP是一个遵循Model-View-Controller(MVC)架构模式的PHP框架...

    CakePHP 1.3 Application Development Cookbook

    #### 二、CakePHP框架简介 CakePHP是一个开源的快速开发框架,基于PHP语言,用于构建和维护Web应用程序。它提供了一套完整的工具集,包括模型-视图-控制器(MVC)架构、自动表单处理、数据库访问层等,使开发者能够...

    PHP框架高级编程-应用Symfony,CakePHP和Zend

    - Chapter12.zip、Chapter9.zip、Chapter11.zip、Chapter16.zip可能涉及了更具体的开发技巧,如表单处理、认证授权、单元测试或部署策略。 - Chapter7.zip和Chapter8.zip可能讲解了Zend Framework的特定模块或与...

    cakephp 1.3

    #### 二、CakePHP 1.3 的核心特性 1. **快速开发**:CakePHP 提供了一系列内置功能,如自动 CRUD 功能,使开发者能够快速创建基本的应用程序界面。 2. **安全性**:通过内置的验证器、输入过滤器、SQL 注入防止...

Global site tag (gtag.js) - Google Analytics