CakePHP程序员必须知道的21条技巧
会阅读所有生成的代码并做必要的修改。
发布程序时注意权限 有一次我在发布程序时,将整个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() - 主要用于生成选择框()所需的数据 * 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''); } 这样该cont |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |