CakePHP manual的中文翻译(粗略翻译,学习笔记)
序
1,读者
这份手册是为了那些像快速建立web程序的人所写。CakePHP是为了帮助PHP各个层次用户简单快速的创建健壮、可维护的程序
这份手册需要一些PHP和HTML的基础知识,对MVC变成模式的一些了解。
2,CakePHP是免费的
遵循MIT License,主页http://www.cakephp.org
3,社区
第一章 CakePHP介绍
1,什么是CakePHP
CakePHP是一个开元的PHP的快速开发框架
2,为什么用CakePHP
CakePHP拥有一些快速开发的特征
1,兼容PHP4和PHP5
2,提供整合的数据库交互CRUD和简单的查询(包括 scaffolding)
3,Request dispatcher(原文Request dispatcher with good looking, custom URLs)
4,快速可变的模版(使用helpers的PHP语法)
5,许多有用的核心特征(access control lists以及AJAX整合等等)
6,在任何网站子目录下面都正常工作,很少需要Apache的配置(原文Works from any website subdirectory, with little to no Apache configuration involved)
3,CakePHP的历史
2005年,Michal Tatarynowicz用PHP写了一个快速开发的框架并发现这是一个好的框架的开始,于是Michal Tatarynowicz在MIT License下公布了这个框架并命名为Cake,并向开发者社区公布,后者现在维护项目并命名为CakePHP
第二章 基本概念
1 MVC模式
为了更好的理解类似Cake的web程序,你需要了解一些 Ruby on Rails这个框架,Cake的灵感就来自于Ruby on Rails。Ruby on Rails是编程语言Ruby的网站开发框架。它实现了Active Record和MVC模式。文章 What goes Where?详细解释了Rails的结构,Cake也使用了类似的结构。
Model View Controller是Gang of Four描述的一个软件的设计模式,Dean Helman介绍:“MVC模式,将一个项目,甚至是一个借口分成三个部分:model,view和controller。开发MVC是为了将传统的输入,处理,输出映射到GUI领域
Input -> Processing -> Output
Controller -> Model -> View
用户输入,外部世界的模型和显示用户的输出被model,view port和controller objects所操作。controller将用户的鼠标、键盘操作解释并映射到对应的命令,然后发送给model或者view并影响相应的变化。model管理一个或若干数据元素,根据状态的查询、变化状态的操作做对应的响应。view port管理一个矩形的显示,并通过图形和文字的结合对给用户准备好的数据作出响应(注:我认为就是显示出来)
关于MVC,你可以通过这个文章了解更多的机制 MVC: Most vexing conundrum
2,Cake的文件结构
当你解压缩安装包,你会发现四个文件夹app, cake, tmp 和vendors.其中cake文件夹是cake的核心库,基本上你不需要进行修改除非你需要对Cake进行一些定制
在
1,如果你有许多的web应用程序,你需要下载并安装Cake两次,这样核心库就重复了,这个是空间的一种浪费。并且违背了CakePHP试图遵循的DRY哲学原则
2,当CakePHP新的版本发布时,你必须非常小心的以免你的app文件夹下面的程序被默认的程序覆盖
app文件夹是你的程序和文件所在的地方。核心库文件夹cake和程序文件夹app的愤慨使得你可以有许多的程序,但只需要一份cake库,并且使得升级CakePHP变得更加容易:你只需要下崽最新版本的Cake并把你当前的核心库cake文件夹覆盖掉,而不需要旦夕覆盖掉你的app文件夹
tmp文件夹是用于存储cake操作的变量,比如baking,caching和logging
vendors文件夹用于存放第三方库文件,你需要在稍后更多的了解vendors
下面的列表显示了主要的文件夹和他们的基本目的
●cake(根目录)
○app(存放你的程序)
●config(配置文件,比如ACL,core, database connection,routes, paths, tags)
●controllers(放置controllers)
●(components,帮助你使用controller的类)
●index.php(cake中有三个该文件,方便用户用不同的方法配置cake)
●models(放置models)
●plugins(放置plugins或者第三方程序)
●views(view相关文件)
●elements(一些重复使用的较小的layout item)
●errors(错误文件)
●helpers(自定义的helpers文件)
●layouts(layout文件)
●pages(PagesController管理的静态内容)
●webroot(把这个目录设置成为网站根目录,并将public files放在这里)
●css
●files
●img
●js
○cake(库文件:最好不要修改)
○index.php
○tmp(用来放置logs,baking)
○vendors(粘贴第三方库文件)
第三章 安装CakePHP
1,Requirements
你必须有一个服务器,具备程序和库来运行CakePHP
1.1 服务器的要求
1.HTTP服务端(比如Apache),下面的选项要打开:sessions, mod_rewrite(虽然不是必须但是建议有)
2.PH
3.数据库引擎(现在已经支持MySQL,PostgreSQL and a wrapper for ADODB)
2.安装CakePHP
2.1 得到最新的稳定版本
www.cakephp.org 点击Downloads>Release
2.2 解压缩
放置到根目录,解压缩,有两种安装方式,开发方式安装使得你可以容易的在一个域名下面察看许多CakePHP程序,产品安装方式使得一个域名下面只有一个程序
3. 建立CakePHP
第一种方法在开发环境下比较合适,但是并不安全。第二种方法跟甘泉可以安装在最终产品的环境下
3.1 开发方式安装
为了开发,我们可以将整个Cake的安装目录放到特殊的DocumentRoot下,如下:
/wwwroot/ /cake /.htaccess /app/ /cake/ /index.php /tmp/ /vendors
|
这种安装wwwroot当作整个网站的目录,所以你的URL如下显示
www.example.com/cake/index.php |
如果你使用了mod_rewrite, 你的URLs会变成下面的这种形式
http://www.example.com/cake/controller_name/action_name/param1/param2 pattern |
3.2 产品方式安装
为了实现产品方式的安装,你必须用于修改服务器上网站根目录的权限,修改根目录,使得整个域像只有一个CakePHP程序
安装后的程序结构如下
../path_to_cake_install/ /.htaccess /app/ /config/ /conftrollers /index.php /models /plugins /views /webroot <-- This should be your new DocumentRoot /cake/ /index.php /tmp/ /vendors |
例3.1 建议的httpd.conf
DocumentRoot /path_to_cake/app/webroot |
在这种配置下,webroot就当作了网站的根目录,你的URL就可能像下面这样
http://www.example.com/ |
如果你使用了mod_rewrite,你的URL就会类似于下面的
http://www.example.com/controller_name/action_name/param1/param2 pattern |
一些共享主机的用户可能没有权限通过修改http.conf来改变DocumnentRoot来指向他们的产品安装。在这种情况下,用户可以安装下面的方式,修改CakePHP的结构。Cake安装在 /path_to_cake_install,文件目录(不可以修改)指向/public_html
/path_to_cake_install /app /cake /index.php /models /plugins /views /webroot |
/public_html (= contents of /app/webroot) /.htaccess /css /css.php /favicon.ico /files /img /index.php /js |
实际上,你将Cake的/app/webroot文件夹的内容拷贝到你已经存在的DocumentRoot。为了告诉Cake你的webroot文件在哪里,将下面几行田间到你DocumentRoot文件夹下面的index.php中(针对上面的例子就是/public_html/index.php)
define('ROOT', BASE_DIR.'/path_to_cake_install'); define ('APP_DIR', 'app'); define ('WEBROOT_DIR', '/public_html'); |
4. 配置Apache和mod_rewrite
当CakePHP没有mod_rewrite支持时候,我们发现许多用户由于不能完美运行他们的系统而苦恼。下面是一些可能需要尝试并且使之正确运行的事情:
● 确定 .htaccess的override是允许的:在你的httpd.conf中,你需要有一段代码,在你的服务器上每个目录。确定AllowOverride对当前的目录设置成为All
● 确定你修改的是系统的httpd.conf,而不是用户或者特定站点的httpd.conf
● 在某些情况下,你可能得到一份缺少 .htaccess文件的CakePHP,这可能是因为某些系统把 .开头的文件当作隐藏文件就不拷贝。确定你拷贝的文件来中包含.htaccess
● 确定你正确上传mod_rewrite。你可以查看一下 httpd.conf中类似于LoadModule rewrite_module libexec/httpd/mod_rewrite.so 和AddModulemod_rewrite.c
5. 确定CakePHP正确工作
现在,我们实际查看一下。根据你选择不同的安装方式,你应该将你的浏览器的URL指向 http://www.example.com或者http://www.example.com/cake.这时,你会看到CakePHP的默认目录,以及一条数据库连接状态的消息。
恭喜!你现在已经可以创建你的第一个基于Cake的程序了。如果你现在什么都没有看到或者受到一条错误信息,可以到http://wiki.cakephp.org或者#cakephp on irc.freenode.net寻找更多的帮助。
第四章 配置
1. 数据库配置
app/config/database.php文件是数据库配置文件。默认安装后并没有database.php文件,所以你需要拷贝database.php.default到database.php. 之后,你可以看到如下:
例4.1
var $default = array('driver' => 'mysql', 'connect' => 'mysql_pconnect', 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'project_name' ); |
根据你的数据库连接信息替换上面的配置
CakePHP支持下面的数据库驱动
mysql postgres sqlite pear-drivername (so you might enter pear-mysql, for example) adodb-drivername |
$default 连接中的connect key允许你设置是否需要持久连接数据库,请仔细阅读database.php.default文件中的注释,以配置你的数据库连接类型。
你的数据库中的表也应该遵循下面的命名规则:
● cake使用的表名(Table name)应该有英文的复数形式组成,比如users, authors, articles. 注意,对应的model是单数形式
● 所有的表 都必须有一个主键叫做 id
● 如果你需要关联tables,使用外键比如 article_id 。表的名字是单数,必须是小写,比如id
● 另外,最好遵从下面的命名规则以便更方便的使用某些功能
Include a ‘created’ 列
Include a ‘modified’列
你也可能注意到了database.php文件中有一个$test的连接,填上这个配置(或者添加其他类似的配置文件),在你使用的时候将下面的代码
var $useDbConfig = 'test'; |
添加到你的一个models中
2. 全局配置
CakePHP的全局配置可以在/app/config/core.php找到。尽管我们确实不喜欢配置文件,但是配置确实很难做。在这个文件中你可以修改一些,每一项设置都可以在core.php的注释中找到。
DEBUG: 设置这个变量不同的值可以帮助你在运行文件的时候debug你的程序。江这个值设成不同的非0值,可以使得Cake打印出SQL语句并且阻止程序下一步进行(原文:Specifiying this setting to a non-zero value will force Cake to print out SQL statements and stop flash messages from forwarding.)
CAKE_SESSION_COOKIE:在你的Cake应用中,这个变量可以设置成为保存用户session的cookie名字
CAKE_SECURITY:这个变量不同的值达标不同的sessions检查等级。Cake创建新的session,删除旧的session都基于这个变量。下面是可能的值:
high: session十分钟后失效
medium: session 二十分钟后失效
low: session 三十分钟后失效
CAKE_SESSION_SAVE: 设置如何保存session。下面是可能的值
cake: 保存在tmp/目录下
php: 根据php.ini中的设置保存
database: 被保存到默认(现在还没有实现,以后继续完善)
3.路径设置
‘Routing’是类似于mod_rewrite的 pared-down pure-PHP(机制),可以帮助将URL影射到 controller/action/params. Cake 添加这个可以帮助我们更好的实现URL转化并使得我们可以脱离mod_rewrite的要求。然而使用mod_rewrite,使得我们的address bar显得更加整洁。
Routes是映射URLs到特定的controllers和actions的独立规则。Routes被配置在app/config/routes.php文件中,设置形式如下:
例4.2 Route Pattern
<?php $Route->connect ( 'URL', array('controller'=>'controllername', 'action'=>'actionname', 'firstparam') ); ?> |
在这里
URL是Cake的URL你想要映射的(URL is the Cake URL you wish to map)
controllername 是你想要调用的controller的名字
actionname 是你想要调用controller的action的名字
firstparam是特定的action的第一个参数
下面的这个例子将/blog下面的所有URL连接到了BlogController. 默认的action是BlogController::index()
<?php $Route->connect ('/blog/:action/*', array('controller'=>'Blog', 'action'=>'index')); ?> |
一个URL 比如 /blog/history/05/june 处理如下:
例4.4 Route Handing in a Controller
<?php class BlogController extends AppController { function history ($year, $month=null) { //..display appropriate content } } ?> |
URL中的’history’被匹配到 Blog route中的:action.( The 'history' from the URL was matched by :action from the Blog's route.) URL中被*匹配的元素被传递到活动的controller的处理方法,这里是$year和$month。比如这个URL /blog/history/05, 仅仅传递一个参数05给history()
接下来的例子是默认的CakePHP route,指向 PagesController::display(‘home’).其中home是一个view,位于/app/views/pages/home.thtml
例4.5 Setting the Default Route
<?php $Route->connect ('/*', array('controller'=>'Pages', 'action'=>'display', 'home')); ?> |
第五章 Scaffolding (脚手架?)
class CategoriesController extends AppController { var $scaffold; } |
有关Scaffold,要注意一个重要的问题: Scaffold期望每个以_id结尾的filed name是一个外键并且指向一个table,table的名称和_id前方的一样(只不过是小写的)。所以,举个例子来说,如果你嵌套了分类,你最好有个列叫做parent_id。在这个版本中,最好能够命名为parentid.同样,在表中有一个外键(比如,titles table有个category_id),并且你已经合适的联结到models(查看6.2理解联结),在show/edit/newd的views中,选择的表将会和外键的表(category)一起自动的表现出来(原文:a select box will be automatically populated with the rows from the foreign table (category) in the show/edit/new views.)。在foreign model中设置$displayField来决定foreign中哪些field会被显示。继续我们的例子,category有个标题
class Title extends AppModel { var $displayField = 'title'; } |
第六章 Models
本章内容:
1. Model Function
1.1 用户定义的Function
1.2 检索(retrieving)你的数据
1.3 保存你的数据
1.4 Model的回调(callbacks)
2. Model的变量
3. Associations
Model是什么,它是MVC模式中的M
Model做些什么。它使得domain logic和presentation分隔开,独立application logic(It separates domain logic from the presentation, isolating application logic.)
一个Model概要的说就是一个指向数据库的access,更具体,就是数据库中的特定的table。默认的,每个model都使用自身名字复数形式的table,比如,User Mode使用 users
table。Models可以维护数据特定的规则,联结信息以及它使用的table的方法。