Cakephp 笔记

1. 自定义 layout

在 cakephp 中 layout 默认指向 /app/views/layouts/default.thtml

如果要自定义 layout,需要在 controller 中定义:

var $layout = 'mydefault';

layout 则指向了 /app/views/layouts/mydefault.thtml

  1. 创建不使用数据库表的 model 或者改变 model 对应的表名

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

var $useTable = false;

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

var $useTable = 'some_table';

  1. 快速创建后台管理

如果你需要创建后台管理程序,并且希望所有管理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 目录设置密码以避免他人随意访问。

  1. 自定义404页面

如果你需要自定义404页面,只需创建 /app/views/errors/error404.thtml。

  1. 让controller使用其他model

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

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

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

2007-11-13 194 cakephp framework php 笔记

Cakephp 的回调函数

Model的Callbacks

我们在model中增加了一些回调函数以帮助你在model操作前后能够织入一些业务逻辑(原文为sneak in,借用了AOP中的织入一词,因为从操作来看这些回调函数等同于AOP中的advice)。为了获得这样的能力,需要使用model中的一些参数并且在你的model中覆写这些方法。

beforeFind(string $conditions)

beforeFind()回调函数是在model的find方法执行前的前置操作。你可以加入任何检索前的业务逻辑。你覆写该方法只要保证在前置操作成功后返回true来执行真正的find方法,返回false中断find方法就可以了。(译注:在一些复杂场景中,需多次持久化的情况下请慎用)。

afterFind(array $results)

使用afterFind回调函数能够更改find方法的返回结果集,或者在检索动作完成后加上一些业务逻辑。该函数的参数$results为经过回调函数处理以后的find检索结果集。

beforeValidate()

beforeValidate回调函数能够在model校验数据之前更改model中的一些数据。同样也可以用来在model校验之前加入更为复杂的额外校验规则。和beforeFind一样,必须保证返回true来调用真正的操作,返回false来中断校验乃至save操作。

beforeSave()

和先前介绍的回调函数类似,在校验完成之后,保存动作之前加入额外的处理(如果校验失败是不会触发该回调函数的)。返回true或者false,不再赘述。

一个比较常见的beforeSave的应用场景就是在保存动作之前格式化日期属性以适应不同的数据库:

// Date/time fields created by HTML Helper: 
// This code would be seen in a view 
$html->dayOptionTag('Event/start'); 
$html->monthOptionTag('Event/start'); 
$html->yearOptionTag('Event/start'); 
$html->hourOptionTag('Event/start'); 
$html->minuteOptionTag('Event/start'); 

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ 
// Model callback functions used to stitch date 
// data together for storage 
// This code would be seen in the Event model: 
function beforeSave() 
{ 
    $this->data['Event']['start'] = $this->_getDate('Event', 'start'); 
    return true; 
} 

function _getDate($model, $field) 
{ 
    return date('Y-m-d H:i:s', mktime( 
        intval($this->data[$model][$field . '_hour']), 
        intval($this->data[$model][$field . '_min']), 
        null, 
        intval($this->data[$model][$field . '_month']), 
        intval($this->data[$model][$field . '_day']), 
        intval($this->data[$model][$field . '_year']))); 
}

afterSave()

放置任何你想要在保存后执行的代码在这个回调函数中。[ToDo 如果保存出错是否会触发?]

beforeDelete()

放置删除前的逻辑代码。想要删除操作执行则返回true,否则返回false。

afterDelete()

放置任何你想要在删除后执行的代码在这个回调函数中。

controller中的回调函数

Cake的controller特别提供了许多回调方法,你可以用它们在一些重要的controller方法之前或者之后插入一些逻辑。如果要利用这些功能,请在你的controller中用这里描述的参数和返回值定义这些方法。

beforeFilter

在每个controller action调用前执行。它是一个检查当前sessoin状态和检查用户角色的好地方。

afterFilter

在每个controller action调用后执行。

beforeRender

在controller逻辑之后,并且在输出视图之前被调用。

2007-11-13 192 cakephp php

CakePHP 命名规则

第1节 规则,嗯 ?

没错,规则。根据thefreedictionary:

  1. 一般约定或者对特定的实践或态度的认可:根据规则,北方一直在地图的最上方。
  2. 在一个组里,一个广泛遵守的实践或和过程,特别能促进社会交互;一种习惯:握手的规则。
  3. 一种广泛被使用或被接受的设备或者技术,例如在小说,文学或者绘画里:旁白的戏剧规则。

Cake的规则会变魔法,称之为自动魔法。Cake让你的生产率提高到一个令你害怕的水平,但又不失灵活性。Cake的规则确实非常简单,而且直观。他们是从最佳实践里提炼出来的,而这些最佳实践是web开发人员在web开发领域里多年使用的实践。

第2节 文件名

文件名带有下划线。作为一般规则,如果你有一个MyNiftyClass类,那么在Cake里,它的文件应该命名为my_nifty_class.php。因此如果你找到一个小片段,你会自动知道:

  1. 如果它是一个命名为KissesAndHugsController的Controller,那么它的文件名必须为kisses_and_hugs_controller.php(注意文件名中的_controller)。
  2. 如果它是一个名为OptionValue的Model,那么它的文件名必须为option_value.php.
  3. 如果它是一个名为MyHandyComponent的组件,那么它的文件名必须为my_handy.php(在文件名里不需要_component)
  4. 如果它是一个名为BestHelperEver的Helper,那么它的文件名必须为best_heler_ever.php.

第3节 Model

  1. Model的类名是单数。
  2. Model类名中,单个单词的model为大写,多个单词的model是大写的骆驼峰。

    实例: Person, Monkey, GlassDoor, LineItem, ReallyNiftyThing

  3. 多对多的join表应该命名为: 按字母排列的第一个表的复数_按字母排列的第二个表的复数.例如: tags_users

  4. Model文件名使用一个小写的带有下划线的语法。

    实例: person.php, monkey.php, glass_door.php, line_item.php, really_nifty_thing.php

  5. 与model相关联的表也使用小写的带有下划线的语法,但是他们是复数的。

    实例: people, monkeys, glass_doors, line_items, really_nifty_things

CakePHP的命名规则意味着流线型的代码创建,并且让代码更加具有可读性。如果你想他遵循你的方式,你可以覆写它。

  1. Model名:在你的Model定义里设置$name变量.
  2. 与Model相关的数据库名:在你的Model定义里设置$useTable变量.

第4节 Controller

  1. Controller名为复数。
  2. 对于单个词的controller,类名为大写,多个词的为大写的骆驼峰。而且Controller类名以'Controller'结尾。

    实例: PeopleController, MonkeysController, GlassDoorsController, LineItemsController, ReallyNiftyThingsController

  3. Controller文件名采用小写的带有下划线的语法。Controller文件名也以'_controller'结尾,因此如果你有一个名为 PostsController的Controller,其文件名应该为posts_controller.php.

    实例: people_controller.php, monkeys_controller.php, glass_doors_controller.php, line_items_controller.php, really_nifty_things_controller.php

  4. 对于保护成员的可见性,controller动作名应该预加一个'-'.

  5. 对于私有成员的可见性,controller动作名应该预加一个'--'.

第5节 View

  1. view在他们显示的动作后命名。
  2. 在动作名后命名view,小写。

    实例: PeopleController::worldPeace() 期望一个在 /app/views/people/world_peace.thtml的view。 MonkeysController::banana() 期望一个在/app/views/monkeys/banana.thtml的view。

你可以在动作的结尾,调用$this->render('没有.thtml的view文件名')来强制一个动作render一个指定的view

第6节 Helper

  1. Helper的类名是骆驼峰的,并以'Helper'结尾,文件名带有下划线。

    实例: 在/app/views/helpers/my_helper.php中类MyHelperHelper 扩展了Helper

使用var $helpers = array('Html','MyHelper')将它包含在controller里;在view里,你可以使用$myHelper->methods()l来访问。

第7节 Component

  1. 组件的类名是骆驼峰的,并以'Component'结尾,文件名带有下划线。

    实例:在 /app/controllers/components/my_component.php里,类MyComponentComponent扩展了对象。

  2. 使用$components = array('MyComponent')将它包含在Controller里。在Controller里,使用 $this->MyComponent->method()来访问

第8节 Vendor

vendor不遵循任何规则,原因非常明显:他们是第三方的代码,Cake没有对它们的控制权力。

Last Updated:2006-12-05

From: http://www.cnblogs.com/confach/articles/577374.html

2007-10-31 192 cakephp convention php