勤快学

CakePHP 中文手册

CakePHP 框架提供了强大的基础来建立你的应用。它可以处理每个细节,从用户的不同请求,到网页的最终渲染。由于框架符合 MVC 设计模式思想,所以可以轻松地定制和扩展你的应用。
该框架也提供了一个基本的组织结构,从文件名到数据库表名,使你的整个应用保持一致性和逻辑性。这个概念虽简单但非常强大。遵守规则,会使你确切地知道东西在哪儿和它们怎么组织的。

CakePHP的结构

控制器 (Controller),模型 (Model) 及视图 (View) 是 CakePHP 的特色,除此之外它也包含了一些附加的类和对象,使得在 MVC 设计模式下开发更快更有乐趣。组件 (Component)、行为 (Behavior) 及助手 (Helper),提供了可扩展性及可重用性来快速新增功能到你的应用中。现在,我们将站在较高的层级上,接着开始寻找一些关于如何使用这些工具的细节。
一次典型的CakePHP请求
图2. 典型的Cake请求
图2. 典型的Cake请求
我们已经看过CakePHP的基本成分了,那么现在就来看看各个对象怎么完成一个基本的请求。继续讲我们之前的请求的例子,想象一下我们的朋友Ricardo刚刚在一个CakePHP的应用的首页上点击了“立刻买一个自定义的蛋糕!”这个链接。
黑色 = 请求的元素, 灰色 = 可选的元素, 蓝色 = 回调方法
1.Ricardo 点击了指向一个URL 的链接, 然后他的浏览器对你的服务器发出了一个请求。
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的浏览器了。

CakePHP 文档结构

在你下载并且解压缩之后,在CakePHP目录下会看到这样一些文件和目录:
1. app
2. cake(较高的cakephp版本是lib/Cake)
3. vendors
4. .htaccess
5. index.php
6. README
其中有三个主要的目录:
1.app目录,将是你施展魔术之处——放置你应用程序的地方。
2.cake目录,是CakePHP的核心代码,请不要随意修改这里边的代码,除非你确信自己有这个能力。
3.vendors目录,是放置第三方PHP库的地方。如果在开发过程中还引入一些除CakePHP之外的库,最好放在这个目录下,便于代码的管理。

CakePHP命名规则

我们是命名规则的拥护者。虽然需要花费一点时间来学习CakePHP的命名规则,你省下更多时间在开发上:根据以下的命名规则,你得到不需花钱的功能,以及你将自己从搜寻设定档维护的恶梦中释放出来。命名规则达成一致的系统开发,允许其它的开发者较容易加入或是提供协助
CakePHP的命名规则从许多开发者多年的经验及一些惯例筛选出来。尽管我们建议你开发时使用命名规则,我们应该提及大部份这些规则简单又直观,特别是在修改旧有系统时较为轻松容易。

MVC的定义

CakePHP遵循MVC软件开发模式。 程序开发设计使用MVC分开你的应用程序为三个主要的部分:
1.模型(Model):就是封装数据和所有基于对这些数据的操作
2.视图(View):就是封装的是对数据显示,即用户界面
3.控制器(Control):就是封装外界作用于模型的操作和对数据流向的控制等,简单来说就是负责处理和分发客户的请求
图示 1显示了一个在CakePHP中的大概的MVC请求范例。举例说明,假设一个名叫"Ricardo"的客户刚刚点击了一个“现在购买一个客户自定义的Cake!”的链接在你的应用程序页面。
1.Ricardo 点击一个链接指向 URL, 并且他的浏览器向你的web server发送了一个请求。
2.接着这个分发器检查 URL请求,并且协助这个请求指到正确的控制器。
3.这个控制器就会执行特定的应用程序逻辑。例如,他将检查看Ricardo是否已经登陆。
4.这个控制器也使用模式去获得应用程序数据层的数据。模式通常展现数据库表,但是他们同时也展现(呈现) LDAP(轻量级目录访问协议)入口 entries, RSSfeeds, 或者系统文件。在这个范例中, 这个控制器使用了一个模式(model)从数据库中去抓取、撷取Ricardo的最近的订单。
5.一旦控制器已经开始魔法似的处理那些数据,他支配了那些数据成为一个视图。 视图的得到这个数据并且让它为展现给客户准备好。 在CakePHP视图通常是使用HTML格式, 但是一个视图应该能够很容易的成为一个 PDF, XML 文档, 或者 JSON 对象依赖于你的需求。
6.一旦视图从控制器中获得数据就会呈现一个完成的编译好的视图给大家,那个视图的内容将会被返回到Ricardo的浏览器。
差不多每次请求你的应用程序都将遵循这个基本原则。稍后我们将会增加一些关于CakePHP这方面的细节,所以当我们继续下去时请谨记此点。
为何使用MVC
为什么要用 MVC模式 呢? 因为它是一个经过考验的真正的软件设计模型,它可以使程序成为可维护的、模块化的和快速开发的包。使用分离的模型(Model)、视图(View)和控制器(Controller)组织的程序是轻便的。新的特性很容易就被加入,旧的程序换上新的外观也是一下子的功夫。模块化和分离的设计使得开发者和设计者能够同时工作,这包括了快速原型的能力。分离的设计令开发者可以修改应用的一部分而不会影响到其他部分。
如果你从来没有用过这种方法建立应用,适应它需要一些努力,但是我们相信一旦你使用CakePHP建立了你的第一个应用,你不会再想用其他方法建立你的应用了。

必要条件

1.HTTP Server. 最好是带 mod_rewrite模块的 Apache , 但不是必要条件.
2.PHP 4.3.2 或更高版本, 没错, CakePHP 可以在php4 或是5下面运行.
技术上来说, 数据库不是必需的,但我们设想每个应用都会用到数据库,cakephp 支持大部分数据库::
1.MySQL
2.PostgreSQL
3.Firebird DB2
4.Microsoft SQL Server
5.Oracle
6.SQLite
7.ODBC
8.ADOdb

准备安装

CakePHP运行很快并且很容易安装。最小的安装环境就需要一个服务器和一份Cakephp的拷贝就行了。很简单的。然而这份文档主要对如何在apache服务器下进行安装进行说明,(因为apache是当前最流行的服务器)。你可以配置cakephp让它在LightHTTPD 或者 Microsoft IIS 服务器下运行。
1.下载一份CakePHP
2.配置你的服务器让它支持php(如果必要的话)
3.检查文件权限
安装
安装CakePHP可以简单到直接把它丢入你网页伺服机的主目录中, 也可以复杂并如你希望般的弹性. 在这部分我们将含括三种安装方式: 开发模式, 实际应用与高级安装.
1.开发模式: 简单又快速, URLs中将包含CakePHP的安装目录, 并不十分安全.
2.实际应用: 必须调试伺服机之主目录, 简洁的URLs, 非常安全.
3.高级安装: 通过一些调试, 能让你把CakePHP主程式放在指定的地方, 更可能让不同的CakePHP分享同样的CakePHP主程式.
配置
配置CakePHP应用程序是一件很有意思的事情。在你安装完CakePHP之后,创建一个基本的web应用程序只需要你配置一下数据库
然而,还有很多其他可选的配置用于适用CakePHP更高级的一些特性。你可以通过继承的方法为CakePHP核心增加功能、配置你自己的路由,或者定义你自己的映射。
控制器(Controllers)
控制器是用来控制逻辑的。通常,控制器会来控制一个独立的模型。举例,如果你要建立一个在线的面包店,你要有 RecipesController 和 IngredientsController 这两个控制器来控制食谱 (Recipe) 和配料 (Ingredient)。在 CakePHP 会以复数的方式命名控制器。
RecipesController 控制 Recipe 模型,ProductsController 控制 Product 模型,依此类推。
一般我们所创建的控制类都继承 CakePHP 的 AppController 类。AppController 继承自 Controller 类AppController 在/app/app_controller.php 文件里定义,它包含很多函数,你的应用程序里面所有的控制器类都要共享这些函数。Appcontroller类的父类Controller类在 CakePHP 标准库中定义。
控制器里的函数通常都会跟 动作 (action)关联。Action 是用来显示视图 (View) 的控制器的函数。一个 action 就是控制器的一个单独的函数。
当一个URL请求匹配和控制器的动作匹配的时候,CakePHP的分发器调用相应的动作完成这个请求。
组件(Components)
组件是封装了一定逻辑处理的,可以在控制器间共享使用的包。当你发现你总是需要在不同的控制器间来回拷贝代码的时候,也许就是时候把这些可以共有的代码打个包,写成组件了。
CakePHP也提供了很多很好用的内置组件:
Security、Sessions、Access control lists、Emails、Cookies、Authentication、Request handling
模型(Models)
模型是数据的表现,在CakePHP中被用来进行数据的访问。通常情况下一个模型对应一张数据库表,不过也可以用来访问其他的数据容器,比如文件,LDAP记录,iCal事件或者CSV文件的行。
一个模型可以与其他的模型建立相互的关系。比如,一张食谱可能会有一位作者作为其要素之一。
行为(Behaviors)
模块的行为是一种用来组织CakePHP模块里定义的某些功能的方法.它使我们可以把那些不是与模块直接相关但又需要的逻辑独立出来。通过提供一种简单但强大的方法来扩展模块,行为(Behaviors)允许我们通过简单地定义一个类变量来加入方法。这就是行为(Behaviors)如何允许模块去掉所有额外的体重,比如可能不是他们正在建模的商业合同的一部分,或是另一个模块才需要的并且可以被推测出来的部分。
举个例子,比如一个模块,它允许我们取得数据库里用来存关于树的信息结构数据。在一个树里删除、新增和迁移结点并不像删除、插入和修改表中的一行数据那样简单。很多个记录可能需要被更新随着结点的移动。相比在每个模块中建立这些树操作的方法,我们可以简单地告诉模块去使用TreeBehavior,或者更正式地来说,我们告诉我们的模块,让它们像一个树一样来行为。这就是所谓的追加一个行为到模块。只需要用一行代码,我们的CakePHP模块就获得了一整套的方法,从而使它可以根据它的结构来互相操作。

数据源

数据源是连接模型和其所代表的数据之间的桥梁。多数情况下,数据被存储在像MySQL,PostgreSQL,或者MSSQL等关系数据库中。CakePHP本身集成了大部分的既有数据库的特定数据源(参考cake/libs/model/datasources/dbo/中的dbo_*等类库文件 ), 为了方便把这些数据源在此做个简单的列表:
1.dbo_mssql.php
2.dbo_mysql.php
3.dbo_mysqli.php
4.dbo_oracle.php
5.dbo_postgres.php
6.dbo_sqlite.php

视图(View)

CakePHP的视图层是展现给用户看到的部分。多数情况下视图应该是供浏览器使用的(X)HTML文档,但也可能是提供给Flash组件的AMF数据,或者通过SOAP响应服务器端应用程序,甚至发送给用户的CSV文件。
CakePHP视图使用PHP文本编写,默认扩展名.ctp (意为CakePHP Template)。这些文件涵盖了从控制器接收数据并按指定格式呈现给用户的所有表现逻辑。
视图文件存放在/app/views/目录下,在以控制器名称命名的文件夹中,以正访问的action名称命名的文件。例如,Products控制器中有一个"view()" action, 那么与之对应的视图文件应该就是/app/views/products/view.ctp。
助手(Helper)
助手(Helper) 是类似组件的类,用于你的应用程序的表现层里。它们包括了一些视图(view),元素(element)或布局(layout)共用的表现层逻辑。
脚手架(Scaffolding)
应用程序脚手架是一种允许开发人员快速定义和创建查、删、改、增程序(CRUD)的技术。CakePHP的脚手架还允许开发人员定义对象之间如何相互联合,以及创建和取消它们之间的关联。
创建脚手架所需要的全部只不过是一个model以及它的控制器。只要在控制器中设置了$scaffold变量,基本上就搞定了。
CakePHP的脚手架那是相当的酷。它可以让你在几分钟之内创建一个基本的CRUD程序出来。如此之酷你可能会将其用于产品环境中去。尽管我们也认为它很酷,但请你一定要认识到脚手架嘛。。。嗯。。。始终只是个脚手架。它拥有一个大致的结构,这样可以让你在项目初期能够快速起步。这并不意味着它很灵活,而是说它只是起步时的一个临时途径。当你发现需要自定义逻辑和视图的时候,也就是该拆除脚手架开始写代码的时候了。CakePHP的Bake控制台,在下一节我们会讲到,是非常重要的下一步:它能够生成多数当前脚手架功能相同的代码。
脚手架在WEB程序早期的时候是一个不错的选择。数据库设计初期会经常改动,在设计过程早期这是相当正常的现象。但有个负面作用:WEB开发人员讨厌创建了表单但却看不到实际的应用。为了减轻开发人员的压力,CakePHP已经内置了脚手架。脚手架分析数据表,并且创建标准的带添加、删除和编辑按钮的列表,编辑用的标准表单以及检视数据库单条记录的视图。

插件(Plugins)

CakePHP允许将创建的控制器、模型和视图联合起来打包发布,作为其它CakePHP程序可以使用的插件。在应用程序中有比较棒的用户管理模块?或者简单的博客?抑或web services模块?将它打包成插件就可以在其它程序中使用了。
插件与安装它的应用程序之间最主要的联系是应用程序的配置(如数据库连接等等)。否则,它只会对它自己的领空生效,就像一个独立的应用程序一样。