2006 年 11 月 21 日
2008 年 2 月 21 日 更新
CakePHP 是一种用 PHP 构建 Web 站点的辅助工具,它稳定、可直接用于生产及快速开发。“ 使用 CakePHP 快速打造 Web 站点” 系列教程向您展示如何使用 CakePHP 构建在线产品目录。
开始之前
编辑说明:本系列最初发表于 2006 年和 2007 年。自从本系列发表以来,CakePHP 开发人员对 CakePHP 做了重大修改,因此原来的内容过时了。为了反映这些修改并充实本系列的内容,作者修订了本系列的五个部分,使它与 2008 年 1 月发布的 CakePHP 版本保持一致。
“使用 CakePHP 快速打造 Web 站点” 系列教程适合希望开始使用 CakePHP 轻松构建应用程序的 PHP 应用程序开发人员学习。通过本系列教程,您将了解如何安装和配置 CakePHP 以及有关 Model-View-Controller(MVC)设计、如何在 CakePHP 中检验用户数据、如何使用 CakePHP helper、如何使用 CakePHP 快速建立并运行应用程序的基本知识。听起来好像有很多东西要学习,但不必担心 — CakePHP 会替您完成其中的大部分工作。
- 第 1 部分主要介绍如何安装并运行 CakePHP,以及如何组成一个简单的应用程序以允许用户注册帐户并登录到应用程序。
- 第 2 部分 演示如何使用 Scaffolding 和 Bake 立即开始应用程序的开发,以及如何使用 CakePHP 的访问控制列表(ACL)。
- 第 3 部分 展示如何使用 Sanitize(一个便利的 CakePHP 类),通过清理用户提交的数据帮助确保应用程序的安全性。第 3 部分还介绍 CakePHP 安全组件、处理无效请求和其他高级请求验证。
- 第 4 部分 主要介绍 CakePHP 的 Session 组件,演示三种保存会话数据的方法;还介绍 Request Handler 组件,帮助您管理各种请求(移动浏览器、包含 XML 或 HTML 的请求等等)。
- 第 5 部分 介绍缓存,尤其是视图和布局缓存,从而帮助减少服务器资源的消耗和提高应用程序的速度。
![]() ![]() |
![]()
|
本教程向您展示如何开始使用 CakePHP。您将亲历整个安装过程,然后实际构建在线产品库。通过这些过程,您将看到使用 CakePHP 究竟可以节省多少时间。本教程将构建在线产品应用程序 Tor,它包含一个 “request dealership username and password” 页面和一个登录页面。
本教程涉及的 CakePHP 主题包括:
- MVC 设计
- helper
- CakePHP 数据检验
本教程假设您熟悉 PHP 编程语言,基本掌握数据库设计且喜欢实战。您不必完全掌握 MVC 模式,因为本教程将会介绍它的基本原理。最重要的是,您必须愿意学习、愿意投入其中并十分渴望缩短开发时间。
![]() ![]() |
![]()
|
开始之前,需要具备一个工作环境。CakePHP 的最低服务器需求为:
- 支持会话(并且最好支持
mod_rewrite
)的 HTTP 服务器。本教程采用的是支持mod_rewrite
的 Apache V2.2.4。 - PHP V4.3.2 或更高版本(包括 PHP V5)。本教程采用的是 PHP V5.2.3。
- 受支持的数据库引擎。本教程采用的是 MySQL V5.0.4。
还需要准备好一个数据库以供应用程序使用。本教程将提供在 MySQL 中创建任何必需的表的语法。
下载 CakePHP 的最简单方法是访问 CakeForge.org 并下载最新的稳定版本。本教程采用的是 V1.2.0。也可以直接使用来自 Subversion 的每日构建和拷贝。CakePHP Manual 中有更详细的信息(请参阅 参考资料)。
安装
无论您的经验水平如何,CakePHP 都可以使应用程序更易于快速编写和维护,从而简化您的工作。CakePHP 有很多非常酷而且十分有用的特性。CakePHP 可以为您处理 Ajax、数据检验和会话。如果可以编写插件告诉 CakePHP 怎样做,它甚至能提供更多帮助。现在您还不能使用 CakePHP。需要先安装 CakePHP。
为了达到本教程的目的,应当在 Web 服务器的 Web 根目录内解压整个 CakePHP 安装目录。在清单 1 中,Web 根目录是 /webroot。
unzip cake_1.2.0.5875-pre-beta.zip cd cake_1.2.0.5875-pre-beta mv * /webroot |
输入 ls -la /webroot
以列出 Web 根目录的内容并检验文件是否已被正确复制。输出应当类似于清单 2。
drwxr-xr-x 12 YOURUSER YOURGROUP 4096 2007-12-15 22:50 app drwxr-xr-x 7 YOURUSER YOURGROUP 4096 2007-12-15 22:50 cake drwxr-xr-x 2 YOURUSER YOURGROUP 4096 2007-12-15 22:50 docs -rw-r--r-- 1 YOURUSER YOURGROUP 139 2007-12-15 22:50 .htaccess -rw-r--r-- 1 YOURUSER YOURGROUP 2303 2007-12-15 22:50 index.php drwxr-xr-x 5 YOURUSER YOURGROUP 4096 2007-12-15 22:50 vendors |
目录 app/tmp 必须是 Web 服务器可写的。通过输入 ls -l app
确认对这个文件夹的权限。输出可能类似于清单 3。
drwxr-xr-x 3 YOURUSER YOURGROUP 4096 2007-12-15 22:50 config drwxr-xr-x 3 YOURUSER YOURGROUP 4096 2007-12-15 22:50 controllers -rw-r--r-- 1 YOURUSER YOURGROUP 953 2007-12-15 22:50 index.php drwxr-xr-x 3 YOURUSER YOURGROUP 4096 2007-12-15 22:50 locale drwxr-xr-x 3 YOURUSER YOURGROUP 4096 2007-12-15 22:50 models drwxr-xr-x 2 YOURUSER YOURGROUP 4096 2007-12-15 22:50 plugins drwxr-xr-x 5 YOURUSER YOURGROUP 4096 2007-12-15 22:50 tests drwxr-xr-x 6 YOURUSER YOURGROUP 4096 2007-12-15 22:50 tmp drwxr-xr-x 3 YOURUSER YOURGROUP 4096 2007-12-15 22:50 vendors drwxr-xr-x 8 YOURUSER YOURGROUP 4096 2007-12-15 22:50 views drwxr-xr-x 6 YOURUSER YOURGROUP 4096 2007-12-15 22:50 webroot |
完成此任务的最简单方法可能是最常见也是最不安全的:将写权限授予每个人:
chmod -R 777 app/tmp ls -l app |
tmp 文件夹的权限应当已经被更新,如下所示:
drwxrwxrwx 7 YOURUSER YOURGROUP 2007-12-15 22:50 tmp |
通常情况下,不建议将写权限授予每个人。理想情况下,应当将这个文件夹的所有权授予 Web 服务器使用的那个用户,或将 Web 服务器使用的那个用户添加到这个目录的一个组中并添加组的写权限。本教程旨在演示如何使用 CakePHP,并不是有关构建安全应用程序的指南。虽然安全性应当是任何应用程序开发的首要考虑事项,但是全面讨论安全 PHP 实践超出了本教程的范围。
为了执行产品安装,将 Web 服务器的 Web 根目录改为 app/webroot,这样做将把可以通过 Web 浏览器访问的代码量减至最少,有助于增强系统的安全性。
![]() ![]() |
![]()
|
在浏览器中,访问与 Web 服务器的 Web 根目录相对应的 URL。例如,如果已将 CakePHP 安装到本地主机的 Web 根目录中,则访问 http://localhost;您应当会看到 CakePHP 默认主页。
注意:如果默认主页看上去更像图 2,则说明 mod_rewrite
并没有按照 CakePHP 所需的方式运行。第一次使用 CakePHP 的用户有时可能会遇到这个问题。
.htaccess 文件应当已出现在 CakePHP 安装目录中。在大多数 *nix 系统中,此文件都是默认隐藏的。如果没有该文件,请检查下载的源文件或从 CakePHP.org 获得最新更新。通过访问安装目录并运行 cat .htaccess
,确认该文件是否存在且有效。这将显示该文件的内容,其内容应当类似于清单 4。
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </IfModule> |
确保为 Web 服务器启用 mod_rewrite
。对于 Apache,httpd.conf 文件中应当会出现两个不同的行。在 LoadModule 列表中,您应当会看到下面一行(或极为类似):LoadModule rewrite_module libexec/mod_rewrite.so
。
在 AddModule 列表中,您应当会看到这一行(或极为类似):AddModule mod_rewrite.c
。
如果您在 httpd.conf 文件中找不到这两行,则 mod_rewrite
未启用。请查阅服务器文档以获得如何解决此问题的详细信息。
确保将 Web 服务器配置为允许 .htaccess 覆盖。对于 Apache,每个目录都应在 httpd.conf 文件中定义。这些定义可能因为安装的不同看上去有所不同,但应当仍会在定义中看到 AllowOverride All 一行。定义可能类似于清单 5。
<Directory "/webroot"> Options Indexes MultiViews AllowOverride All Order allow,deny Allow from all </Directory> |
有关 .htaccess 覆盖的更多信息,请参阅服务器文档。
![]() ![]() |
![]()
|
既然已经安装了 CakePHP,并已与 Web 服务器关联了起来,就需要把 CakePHP 引入数据库。本节介绍如何设置数据库配置和检验 CakePHP 是否接受这个数据库。Tor 需要一个位置来保存其用户和产品数据。然后要创建一个 users 表,该表用于构建 Tor 的登录和注册部分。
设置数据库配置十分简单,但在开始之前,要确保数据库服务器处于运行状态,确保已经为应用程序创建了数据库,并确保拥有一个用户的用户名和密码(这个用户具有对数据库进行操作的权限)。
首先,制作 app/config/database.php.default 文件的一个拷贝并将其保存为 app/config/database.php。这样做是为了保留一个原始模板的拷贝。在您喜欢的文本编辑器中打开该文件并查找以下部分(它应当非常接近该文件的底部)。
清单 6. app/config/database.php.default 文件
var $default = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'port' => '', 'login' => 'user', 'password' => 'password', 'database' => 'database_name', 'schema' => '', 'prefix' => '', 'encoding' => '' ); |
根据自己的情况修改以下信息:
-
driver
-
此字段可以是
mysql
、mysqli
、postgres
、sqlite
、mssql
、db2
、oracle
、adodb
或pear-drivername
。本教程假定它是mysql
。
-
persistent
- 此字段告诉 CakePHP 是否应当使用持久的数据库连接。有效值是 true 或 false。本教程假定它是 false。
-
host
-
这是数据库服务器的主机名,例如
localhost
或mysql.yourdomain
。
-
port
- 如果数据库在非标准端口上运行,可以在这里指定要使用的端口。
-
login
-
这是用于数据库登录的用户名,比如
dbuser
。
-
password
-
这是用于数据库登录的密码,比如
secretsecret
。
-
database
-
这是希望使用的数据库的名称,比如
cakedev
。
-
schema
- 这个字段用来指定将使用什么数据库模式。它可以为空。本系列不讨论数据库模式。
-
prefix
-
前缀是一个字符串,比如
cp_
,它是 CakePHP 执行的任何数据库调用的表名前缀。如果数据库由多个应用程序共享,而又要保证在两个或多个应用程序需要使用具有相同名称的表时(比如users
)表不会相互覆盖,那么就有必要使用前缀。
-
encoding
- 这个字段用来指定数据库使用的编码。对于本系列,这个字段可以为空。
请不要忘记保存文件。
可以在 database.php 中指定任意数目的数据库配置,只要这些数据库配置具有不同的名称。可以指定应用程序应当在模型中使用哪个数据库配置。
数据库和 CakePHP 的一些注意事项:
- 表必须具有名为
id
的主键。 - 如果表中包含 created 或 modified 列,CakePHP 就会在适当的时候自动填充字段。
- 表名应该为复数(users、products、eggs、sodas、winners、losers)。其相应的模型将具有单数的名称(user、product、egg、soda、winner、loser)。
- 如果要将表关联起来,外键应当采用
table_id
格式,且使用单数的表名。例如,user_id
、product_id
、egg_id
、soda_id
、winner_id
和loser_id
是表的 user、product、egg、soda、winner 和 loser 的外键。
![]() ![]() |
![]()
|
返回到用于检验初始安装的 URL。应当会看到 CakePHP 默认主页已经改为显示数据库配置的状态。
如果默认主页指出数据库配置文件不存在,则您可能将其放在了错误的位置或者其名称不正确。确保数据库配置文件为 app/config/database.php。如果默认主页指出 CakePHP 无法连接数据库,那么确认输入的连接信息是否有效,然后重试。
![]() ![]() |
![]()
|
现在,CakePHP、Web 服务器和数据库都关联到一起了。开始动手实践吧!Tor 需要一个 users 表。
这个表将包含识别用户和与用户交互所需的基本信息。简单的用户名和密码字段可能就够了,但其他信息也可能有用,例如电子邮件地址(用于发送密码重置请求)、名字和姓氏(用于个性化服务)以及最后一次登录的日期(用于帮助跟踪不活动的帐户)。您可能希望用户名和电子邮件字段是惟一的。另外,不要忘记主键 ID 字段。创建表的 SQL 可能类似于清单 7。
CREATE TABLE 'users' ( 'id' INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , 'username' VARCHAR( 40 ) NOT NULL , 'password' VARCHAR( 40 ) NOT NULL , 'email' VARCHAR( 255 ) NOT NULL , 'first_name' VARCHAR( 40 ) NOT NULL , 'last_name' VARCHAR( 40 ) NOT NULL , UNIQUE ( 'username' ,, 'email' ) ) TYPE = MYISAM ; |
注意,username
、password
、first_name
和 last_name
字段最多包含 40 个字符。在 user 模型中将强制要求不超过这个字符长度。在本例中,40 个字符的最大长度完全是任意设定的。