(一)CakePHP的基本原则A.CakePHP的结构控制器(Controller),模型(Model)及视图(View)是CakePHP的特色,除此之外它也包含了一些附加的类和对象,使得在MVC设计模式下开发更快更有乐趣。组件(Component)、行为(Behavior)及助手(Helper),提供了可扩展性及可重用性来快速新增功能到你的应用中。现在,我们将站在较高的层级上,接着开始寻找一些关于如何使用这些工具的细节。a)控制器扩展──组件(Component)组件(Component)是一个帮助简化控制器逻辑的类。如果你有一些想要在控制器(或应用程序)之间共享使用的逻辑,那么组件通常是很适合的。比如,框架核心提供的EmailComponent组件使得创建及发送email成为一个轻松的工作。所以并不是在一个控制器内编写发送email的方法,而是包装这样的逻辑以便在整个应用中被其他控制器共享使用。控制器也同样配有回调函数(Callback)。当你需要在CakePHP核心操作之间插入一些逻辑时,可利用这些回调函数。可利用的回调函数包括:beforeFilter(),在所有的控制器动作逻辑开始之前执行beforeRender(),在控制器动作逻辑之后执行,但在视图输出之前afterFilter(),在所有的控制器动作逻辑之后执行,包括视图输出。也许在afterRender()与afterFilter()之间没有什么不同,除非你手动在你的控制器动作之中呼叫render()及此后的包含一些逻辑操作。b)视图扩展──助手(Helper)助手(Helper)是用来辅助视图逻辑的类。与组件在控制器中的使用非常类似,助手允许在多个视图中存取及共享显示逻辑。其中一个核心助手是,AjaxHelper,它使得在视图中请求Ajax变得十分简单大多数的应用程序都会有许多重复使用的视图代码片段。CakePHP使用布局(layout)及元素(elements)使得重用视图代码更为容易。预设的情况下,每个被控制器渲染的视图都出现在一个布局内。元素被使用在当小片段代码的内容需要被重用在多个视图的时候。c)模型扩展──行为(Behavior)同样的,行为(Behavior)是用来在模型之间加入共享功能。举例来说,如果你将用户资料储存在树结构中,你可以具体指定你的User模型使用像树结构的行为,并获得在你的树结构中自由操作移除、新增和搬移节点的功能模型(Model)也支持另一个叫做DataSource的类。DataSource是一个让模型以一致的方式操作不同类别数据的抽象层。虽然在CakePHP应用中主要的数据来源通常是数据库,但你也可以编写附加的DataSource来使模型表达RSSfeeds、CSV文件、LDAP目录数据或iCal事件。DataSources允许你从不同的数据来源来操作记录,而不只限制在使用SQL语句。DataSources也允许你通过LDAP模型关联到许多iCal事件。就像控制器一样,模型也有使用回调函数的特性:beforeFind()afterFind()beforeValidate()beforeSave()afterSave()beforeDelete()afterDelete()透过这些回调函数的名称,就应该可以了解它们的作用。你可以在讲述模型的章节找到更详细的信息。d)应用扩展ApplicationExtensions控制器(Controller)、助手(Helper)、模型(Model)都有各自的父类,你可以用来定义应用层次的更改。AppController(控制器父类,位置/app/app_controller.php),AppHelper(助手父类,位置/app/app_helper.php)以及AppModel(模型父类,位置/app/app_model.php),都是放置你想要在整个应用中所公用控制器、助手或模型功能的好地方。路由(Route),尽管不是类或文件,但它在CakePHP中扮演请求回应的角色。路由定义CakePHP如何对映URL与控制器动作之间的关系。默认的路由行为将/controller/action/var1/var2对映至Controller::action($var1,$var2),但是你可以使用路由来自定URL以及它们如何对应你的应用。一些在应用中的功能是值得整个打包的。插件(Plugin)是一个实现了特定功能的程序包,包含了模型、控制器和视图,并可以延申到多个应用之中。用户管理系统或简单的blog也许是一个相当适合的CakePHP插件B.一次典型的CakePHP请求我们已经看过CakePHP的基本成分了,那么现在就来看看各个对象怎么完成一个基本的请求。继续讲我们之前的请求的例子,想象一下我们的朋友Ricardo刚刚在一个CakePHP的应用的首页上点击了“立刻买一个自定义的蛋糕!”这个链接。图2.典型的Cake请求。黑色=请求的元素,灰色=可选的元素,了;蓝色=回调方法1.Ricardo点击了指向的链接,然后他的浏览器对你的服务器发出了一个请求。2.路由(route)从URL中解释并提取出这次请求的参数:控制器(controller),动作(action)以及其他在这次请求中影响到业务逻辑的所有其他参数。3.使用路由后,请求的URL被映射到一个控制器的动作中(在特定的一个控制器的类的一个方法)。在这个例子,是CakeController类的buy()方法。在控制器的所有动作逻辑执行之前会调用beforeFilter()回调方法(callback)。4.控制器可能会使用模型来处理应用的数据。在这个例子里,控制器使用了一个模型从数据里得到Ricardo上次买的东西。在这次操作中所有这个模型适用的回调方法、习惯(behavior)和数据源(DataSource)都可能得到实施。即使模型没有被用到,所有的CakePHP控制器的初始化至少都需要一个模型。5.当模型取得数据后,数据会被返回到控制器。模型的回调方法可能会被实施。6.控制器可能使用组件对数据进行进一步的加工,或者进行其他的操作(例如会话处理、验证或者发电子邮件)。7.一旦控制器使用了模型和组件以有效地准备数据,就可以使用控制器的set()方法把数据传送到视图(view)。在数据送到视图前,控制器的回调方法可能会被实施。视图逻辑会被执行,可能包括了各种元素及(或者)帮助方法。默认情况下,视图会在一个布局(layout)里被渲染。8.附加的控制器回调方法(像afterFilter)可能被实施。最后,完整的经过渲染的视图代码就被送到Ricardo的浏览器了。C.CakePHP档案结构让我们来看看CakePHP的盒子里是用什么组成的。你知道CakePHP看起来像是从基本MVC组成的,但你也同样需要知道它档案是如何组织的。appcakedocsindex.phpvendors当你下载了CakePHP,你将看到四个主要的资料夹。app资料夹将是你施展你的魔术之处:这是你放置你应用程序的地方。cake资料夹是我们施展我们魔法的地方,请不要修改这个资料夹里的所有档案,如果你修改而导致魔法失效,我们将无法帮助你除错。docs资料夹放置了典型的读我、版本更新记录及授权资料档案。最后,vendors资料夹是可以放置需要使用在你应用程序的第三方PHP函数库a)App资料夹CakePHP的app目录将是开发应用程序时最常使用的一个。就让我们来更仔细的看app资料夹里面有些什么config拥有一些CakePHP使用的设定。资料库连结的详细资料、启动组态、核心设定档案及许多应该被储存在这里的档案。controllers包含你的应用程控器及它们的组件。locale储存用来国际化的字符档案。models包含你的应用程序模型、行为和资料来源。plugins包含插件包裹。tmp这是用来储存CakePHP暂存资料的。实际上储存的资料是看你如何设定CakePHP,但这个资料夹通常用来储存模型描述、记录档和会谈资讯。vendors所有的第三方类别或函数库应该被放置在这个资料夹。可以简单的以App::import(‘vendor’,‘name’)使用它们。也许你会觉得多馀或困惑于此处有vendors而上一层目录内也有vendors资料夹,这其中的差异是当我们讨论到管理多应用程序和较为复杂的系统设定时,可以使用不同的配置。views展示层的档案被放置在此处:元素、错误页面、小帮手、布局和视图档案。webroot在产品安装模式下,这个资料夹应该是应用程序的根目录。包含了样式表、影像和JavaScript档案可放置的资料夹。D.CakePHP命名规则我们是命名规则的拥护者。虽然需要花费一点时间来学习CakePHP的命名规则,你省下更多时间在开发上:根据以下的命名规则,你得到不需花钱的功能,以及你将自己从搜寻设定档维护的恶梦中释放出来。命名规则达成一致的系统开发,允许其它的开发者较容易加入或是提供协助CakePHP的命名规则从许多开发者多年的经验及一些惯例筛选出来。尽管我们建议你开发时使用命名规则,我们应该提及大部份这些规则简单又直观,特别是在修改旧有系统时较为轻松容易a)档案及类别名称命名规则一般来说,文件名是由下划线将单词分开,但是类名通常使用驼峰命名法。举例来说,类KissesAndHugsController的文件名会是kisses_and_hugs_controller.php。然而文件名不一定都以这样的规则来命名。例如:类EmailComponent的文件名是email.php,而类HtmlHelper的文件名会是html.php。b)模型及资料库命名规则模型类别名称是单数且使用骆驼命名法。Person、BigPerson、和ReallyBigPerson都是模型命名规则的例子。资料表名称对应到CakePHP模型是复数且以下划线分隔单字。资料表名称people、big_people和really_big_people,会各自与上述的模型对应。外键在hasMany、belongsTo或hasOne关系中随着相关模型在之后加上_id是被认可的。所以如果一个糕点师有许多饼干,饼干这个资料表透过baker_id外键将参考到糕点师这个资料表。结合资料表,使用hasAndBelongsToMany(HABTM)关系在模型之间的命名方式必需依照字母先后次序(是apples_zebras而不是zebras_apples)所有资料表与CakePHP模型互动(除了join资料表)需要有一个主键使每一列单一识别。如果你希望使用无单一识别主键的资料表,像是你的posts_tags结合资料表,CakePHP的命名规则就是加在资料表名称的单一主键。CakePHP不支援复合主键。在这情况下你要直接操作你的结合资料表资料,这代表你需要使用直接查询呼叫或是增加主键来使用一般的模型。例如:CREATETABLEposts_tags(idINT(10)NOTNULLAUTO_INCREMENT,post_idINT(10)NOTNULL,tag_idINT(10)NOTNULL,PRIMARYKEY(id));c)控制器命名规则控制器的类别名称是复数,使用骆驼命名法,并在最后加上Controller。PeopleController和LatestArticlesController,都是控制器命名规则的例子。你写一个控制器的第一个函数可能是index()函数。当一个请求是控制器而非动作的时候,预设的CakePHP行为是去执行控制器内的index()函数。例如一个请求将映像至ApplesController叫用index()函数,而会映像至ApplesController叫用view()函