Issuu on Google+

工具,开发环境学习 By Ryan Micarl 2009.04.27 1.

开发环境的配置:xampp+aptana+cakePHP;

2. 3.

PHP 基础; CakePHP 详细介绍;

(4. Javascript+jQuery 初步; 5. 其他的内容了解,XHTML+CSS。) 4. 5. 请查看 http://www.w3school.com.cn/的相关教程,了解即可。不了解也没关系,主要是页面设计(view)需 要的内容,只有知道: 1. HTML 定义了呈现给用户的网页内容; 2. CSS 通过定义 HTML DOM 元素的样式将网页的内容以漂亮的形式呈现给用户; (HTML 和 CSS 的配合就使用户看到了一个网页的静态形式) 3. javascript 的作用和 css 类似,同样是对 HTML DOM 元素的操作,但侧重于实现网页的动态效果,jQuery(包括 jQuery ui 包和其他的 plugins)是一个完善的开源的 javascript 库。利用它可以方便的完成几乎所有的网页动态 的设计效果。并且完成部分客户端的业务逻辑(大部分的业务逻辑需要客户端脚本 php(CakePHP)来完成),减 轻服务器端的压力。

+css; +javascript(jquery)

+php(CakePHP)

+MySQL DB

+浏览器兼容

+CakePHP 配置

+php(CakePHP)

图 1:一个典型的 CakePHP 请求,和 CakePHP 如何与其他的静态内容配合,完成请求的响应的每一个步骤。


1.

开发环境的配置:xampp+aptana+cakePHP; XAMPP

Xampp 是一个开源的网站开发环境,下载 windows 版本的 xampp, 相当于将你的电脑设置为了一台服务器。 Xampp 仅需要少量的配置 1. 将 xampp 安置在一个根目录下:e.g. E:/xampp 2. 打开 xampp 的控制台:xampp-control.exe; 启动 apache 和 mysql。[注意], 不用通过快捷方式打开 xampp-control.exe,这有可能导致 apache 无法启动(apache 路径不对); apache 和 mysql 不一定能够一次就启 动,有时需要多点几次 start(开始) 3. 打开浏览器,输入 localhost, 显示”it works”表示 xampp 安装成功; 4. 输入 localhost/xampp 就能够进入 xampp 的控制页面,从中可以获得 xampp 当前的状态,按照提示进行 xampp 的一些配置,只有完成 phpMyAdmin 的秘密设置就可以了 5. 在侧边条中的 phpMyAdmin 就可以进入 MySQL 数据库的创建 APTANA Aptana 是一个开源的网站开发平台, 提供对 html,css, javascript, php 等脚本语言的编辑和调试, (可以把它作为一 个脚本编辑器使用) 1. aptana 无需安装,但需要安装 java jre(jre-6u12-windows-i586-p-s.exe),然后就可以使用了 2. 启动 aptana 后,选择 help  aptana help  my aptana,再选择 plugins 中的 aptana php,点击 get it,下载到 php 的插件,这步必做,否则 aptana 仅将 php 文件当做普通文本文件, 最后,因为 cakePHP 中的 view 文件(*.ctp) 也是 php 文件,选择 windowspreferences,在 generalContent types

Text  PHP Source File  add 按钮,

添加.ctp 文件,让 aptana 将.ctp 文件当做.php 文件处理。 cakePHP cakePHP 提供了网站开发的框架,采用 MVC 模式,方便快速开发网站。 下载 cakePHP 后,解压缩到 xampp/htdocs 目录下,比如命名为 cake 在浏览器中输入 localhost/cake,打开 cakePHP 的默认首页,按照最顶部的提示,修改 cakePHP 的配置。 完成后,配置 apache 的 httpd.conf 文件(xampp\apache\conf\httpd.conf), 搜索“DocumentRoot”, 默认为 DocumentRoot = ” E:/xampp/htdocs”将它的值修改 ” E:/xampp/htdocs/cake/app/webroot”, 同时修改下面稍后几行处的<Directory "E:/xampp/htdocs">, 将其改为 <Directory "E:/xampp/htdocs/cake/app/webroot"> 意思是让 apache 服务器的默认网站根目录设定为 cake/app/webroot.


2. PHP 基础 [说明]:CakePHP 是以 PHP 为基础构建的一个 MVC 框架式的开发包,它实际上相当于是在 PHP 基础上的一种新的 网站开发(脚本)语言,类似于 C++是在 C 的基础上发展起来一样。所以,我们只需要学会最基本的 PHP 语法即 可,学习下一章的 CakePHP 才是现在的重点。 参考的网上教程:http://www.w3school.com.cn/php/index.asp 1.1 PHP 简介 PHP 文件可包含文本、HTML 标签以及脚本。PHP 文件中的脚本可在服务器上执行,是一种服务器端脚本语 言。(Javascript 是一种服务器端脚本语言) * PHP 支持大部分的数据库,通常与 MySQL 组合,尤其是因为这个组合的跨平台性(意思是您可以在 Windows 环境进行开发,而在 Unix ) * PHP 可在不同的平台上运行(Windows、Linux、Unix) * PHP 与目前几乎所有的正在被使用的服务器相兼容(Apache、IIS 等) * PHP 易于学习,并可高效地运行在服务器端 开发环境:Windows+PHP+MySQL+Apache(windows 版本的 xampp 相当于方便的配置了 PHP+MySQL+Apache 开发环境) 1.2 PHP 语法,PHP 的语法非常类似于 C++,易于学习,与 C++不同的以橙色标示 

您无法在浏览器中通过查看源文档的方式来查看 PHP 的源代码 - 您只能看到 PHP 文件的输出,即纯粹的 HTML。这是因为在结果返回浏览器之前,脚本就已经在服务器执行了。

PHP 的脚本块以 <?php 开始,以 ?> 结束。 可以把 PHP 的脚本块放置在文档中的任何位置。 <?php /*php code here;*/ ?> PHP 脚本可以内嵌在 html 标签中,类似: <html> <body> <?php echo "Hello World"; ?> </body> </html>

 

PHP 注释(C 风格)/**/ 和// PHP 变量: 一旦设置了某个变量,我们就可以在脚本中重复地使用它; PHP 中的所有变量都是以 $ 符号开始的; 在 PHP 中设置变量的正确方法是: $varName = value;(为了遵守 cakePHP 的命名规则,使用 cemalCast 命名)。 在 PHP 中,不需要在设置变量之前声明该变量。PHP 会自动地把变量转换为正确的数据类型。

PHP 字符串 用 echo $str; 来输出字符串,最常用的功能是利用 echo 来返回良好格式的 HTML 字符串;


PHP 的字符串连接运算符:(.) PHP 提供功能齐全的字符串操作函数: 

http://www.w3school.com.cn/php/php_ref_string.asp PHP 运算符(算数运算符、赋值运算符、比较运算符、逻辑运算符),完全的 C 风格; 取引用操作符 &;e.g. $var2 = & $var1; 仅增加的唯一运算符:(.= 用为字符串的自加) PHP 的程序流程控制,完全的 C 风格; 仅针对 PHP 的特殊对象 Array 的方便操作,增加了 foreach 程序控制,用来遍历 Array 中的所有元素:两种典 型的语法应用:(参考后面的 PHP Array) 1. 当仅关心一个数组中的存储的值时: foreach ($ary as $value) { //code to be executed; } 2. 当需要数组中的键-值对时: foreach ($ary as $key => value) { //code to be executed;

} PHP Array PHP 除了可以定义完全 C 风格的 Array 外,更强大是可以为 Array 中每个值设定一个键,形成 key => value 对; 这个特性被大量的用于 PHP 中的参数传递,通过传递包含 key=>vaule 对的 array, 可以向函数传递良好格式的 大量参数,而不需想 C 函数中,定义单独的变量。 3 种 PHP Array: 1. 数值数组:带有数字 ID 键的数组: e.g. $names = array("Peter","Quagmire","Joe"); e.g.

$names[0] = "Peter"; $names[1] = "Quagmire"; $names[2] = "Joe";

2. 关联数组:数组中的每个 ID 键关联一个值: e.g. $ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34); e.g.

$ages['Peter'] = "32"; $ages['Quagmire'] = "30";

$ages['Joe'] = "34"; 3. 多维数组: e.g. $families = array ( "Griffin"=>array ( "Peter", "Lois", "Megan" ), "Quagmire"=>array ( "Glenn" ), "Brown"=>array ( "Cleveland", "Loretta", "Junior" ));


PHP 函数 唯一的区别是:PHP 的弱类型,所以,PHP 函数不需要指明函数返回类型和函数参数的类型,如果在函数中 确实需要某一类型的参数,可以用 is_dataType()[e.g. is_array()]函数来测试是否是特定类型的参数。 function functionName($param1, $param2, ...) { //codes here; return $somethins; }

PHP 日期和时间 在网页设计中,会经常用的对日期和时间的处理,PHP 提供了不少处理日期和时间的函数: 1. Unix 时间戳:输出一个整数 time(); mktime(); gmmktime(); 将字符串转变为时间戳: strtotime(); //e.g. strtotime(‘+1 day’); 输出一天后的时间戳; 2. 日期格式化:输出人类可读的格式化日期和时间字符串 date(); gmdate();

PHP 面向对象 这是学习 CakePHP 最重要的基础,联系 Java 的面向对象基础,原理相同,只是关键字不同 e.g. PHP 面向对象的关键字实例 <?php class Child extends Base { var $var = 100;

//特别,在 PHP 类的成员定义时就设定其初始值

private $private = 100; //私有成员 static $static = 0; //静态成员 protected $protected = 0; function funOne() { $this->var = 200; parent::baseFunOne(); //仅对直接父类 Base::baseFunOne}; //对所有的祖先父类,指定父类名称即可 private function funTwo() {}; //私有成员函数 static function funThree() {}; //仅能操作 static 成员 protected function funFour() {}; //保护成员函数 final function funFinal() {}; //防止子类覆盖 function __clone() {}; //在 PHP5 中,将对象赋值给变量时,是将引用赋值给变量,调用__clone 方 法来进行对象的复制;而在 PHP4 中,默认的赋值是进行对象的复制。 //构造函数 function __construct(//...) {}; //不兼容 PHP4, 仅对 PHP5 适用 function Child(//...){}; //兼容 PHP4, PHP5 //析构函数 //仅 PHP5 function __destruct() {}; } ?>


3. CakePHP 详细介绍; PART 1: 基础,原理性,需要记忆的内容 1. 最重要的两张图: cakePHP-1.2-cheatSheet.pdf 一次典型的 CakePHP 请求 2. CakePHP 的核心:MVC 3. CakePHP 的扩展: Model:Behaviors(对我们来说不是太需要) DataSource(对我们来说不是太需要) 回调函数, 在 CakePHP 的核心操作之中插入一些逻辑:e.g. beforeFind(), afterFind(), beforeValidate(), beforeSave(), afterSave(), beforeDelete(), afterDelete(). View:

实际上,CakePHP 里面不存在单独的 view 文件,它是一类特殊 php 文件(*.ctp)的集合。包括: a. layout 文件:定义了一个页面的框架,通常其中的包含了 html <DocType>,<Head>,<body> 中的静态部分<header div>和<footer div>,同时定义了动态添加内容的入口: 最经常是的 $title_for_layout, $script_for_layout,和$content_for_layout;另一种用于 Ajax 请求的 layout 文件 就仅仅包含需要返回的部分。 b. action 文件:对应于 Controller 中的每个具体的 action(公开函数),action 文件用 action 中获 得的数据,格式化为 HTML 文档的形式,通过$content_for_layout 入口,再传递到一个指定的 layout 文件中,最终产生对用户发送 url 请求的 HTML 页面。 c. element 文件:是指能够被重复利用的代码段。通常,某些 action 文件,甚至是全部的 action 文件都用到某些相同的代码段,使用相同的变量,这时,就可以将这些代码段,单独写成 element 文件,通过在 action 文件(或其他文件)中,直接通过$this->element(‘fileNameOfElement’),就 能够动态地调用 element 文件。 d. helper 文件:比 element 文件更加小,且更加具有可重用性的是 Helper 文件。他们是定义良 好的 PHP 类,通常只包含众多的公共函数,不包含成员变量,每个公共函数用于生成格式良好 的 HTML 代码段,通常是生成一个 HTML 闭包<tag>生成的内容</tag>。cakePHP 提供了不少核心 的 helper 文件,最常用的如 Html, Javascript, 以及 Form 等,(我们不会采用 Cake 提供的 Ajax Helper,而采用 jQuery 提供的 Ajax API,后者更加方便),我们也可以自定义 helper 文件(如已 经定义的 module.php,用于生成 module 中的 HTML 代码)

Controller:Component 文件是一个帮助简化 Controller 逻辑的类别。如果你有一些想要在 Controller(或应 用程序)之间共享使用的逻辑,那么 Component 通常是最适合的。CakePHP 已经提供了相当数 量的 Components: ACL(Access Control List), Auth(Authentication), Cookie, Email, Request Handling, Security, Sessions 此外,同 Model 一样,Controller 也具体回调函数供使用: * beforeFilter(), 在所有的控制器动作逻辑开始之前执行 * beforeRender(), 在控制器动作逻辑之后执行,但在视图输出之前 * afterFilter(), 在所有的控制器动作逻辑之后执行,包括视图输出。 也许在 afterRender() 与 afterFilter()之间没有什么不同,除非你手动在你的控制器动作之中呼叫 render()以及包含 一些逻辑在呼叫之后


4. CakePHP 的文件结构: * app //开发中的核心,所有开发的内容都将放在此文件夹下 * cake //Cake 的核心文件,一般不改动 * docs //一些 readme 之类的文档 * index.php //默认首页 * vendors //存放第三方 PHP 函数库文件 4.* CakePHP app 文件夹结构 CakePHP 的 app 目录将是开发应用程式时最常使用的一个: Folder: [说明] config

拥有一些 CakePHP 使用的设定。资料库连结的详细资料、启动组态、核心设定档案及许多应该被储 存在这里的档案。

controllers 包含你的应用程式控制器及它们的组件。 locale 储存用来国际化的字元档案。 models 包含你的应用程序 Model、Behavior 和 DataSource。 plugins tmp

包含插件。 这是用来储存 CakePHP 暂存资料的。实际上储存的资料是看你如何设定 CakePHP,但这个资料夹通

常用来储存 model descriptions, logs, and sometimes session information. vendors 所有的第三方程序库应该被放置在这个资料夹。可以简单的以 App::import('vendor', 'name')使用它们。 也许你会觉得多馀或困惑于此处有 vendors 而上一层目录内也有 vendors 资料夹,这其中的差异是当 我们讨论到管理多应用程式和较为复杂的系统设定时,可以使用不同的配置。 views

展示层的档案被放置在此处:elements、错误页面、helpers、layouts 和 view files。

webroot 在产品安装模式下,这个资料夹应该是应用程式的根目录。包含了 css、img 和 JavaScript 可放置的 资料夹。 5. CakePHP 的命名规则: CakePHP 神奇的地方是你不需要去配置大量的东西,就可以使用 CakePHP 的神奇功能,代价是,你必须 遵守它的一些“死”规定。这里的规定主要指 CakePHP 的命名规则。当然我们可以对一些特殊情况,在 CakePHP 的某些配置文件中进行配置,不过,仅仅遵守下 CakePHP 规定的命名规则,可以省去开发上的 麻烦。而且这样更加有利于写成统一风格的代码。 参考:CakePHP-1.2-cheatSheet.pdf 1. 文件名的命名:所有文件名必须小写,以下划线分割每个单词, e.g. file_name.ctp。除了 Controller 文 件的文件名需要加上_controller 后缀外,其他类型的文件都不需要后缀,也就是说, 一个 Controller 的类名为:GoalsController,它的文件名为 goals_controller;而它对于 的 Model 类名为 Goal,文件名为 goal, 而不是 goal_model;一个 Helper 的类名为 2. 类名的命名:

ModuleHelper,它的文件名为 module,而不是 module_helper 首字母大写,用 CamelCased 来风格单词: e.g. ClassName

3. 数据库中表的命名:小写,以下划线分割单词,单词用复数形式。e.g. db_tables 表中的外键命名为: [foreign_key]_id 为了表示多对多关系的辅助关联表:表的命名为 table1s_table2s,并且 table1 和 table2 必须按照字母顺序排列:e.g. 应该是 goals_users, 而不是 users_goals 4. Model 的类名和文件名:首选遵守文件名和类名的命名规则,其次,Model 的类名和文件名为对应数 据库中表名的单数:table of goals  Goal model,其文件名 goal 5. Controller 的类名和文件名:首选遵守文件名和类名的命名规则,其次,Controller 的类名和文件名为 对应 Model 类名的复数+后缀 Controller。Goal model  GoalsController goals_controller


6. View 的类名和���件名:对应于一个 Controller 中的每一个 Action,必须定义响应的 action 文件,并且 放在以 Controller 的名称命名的文件夹下: GoalsController 中的 viewAll action 下,对应 的有个文件/views/goals/viewAll.ctp _____________________________以上是 CakePHP 中必须熟悉的基础内容_______________________________ PART 2:如何利用 CakePHP 来完成网站的开发,基本的 CakePHP 配置,MVC 和他们的扩展,了解即可 1. CakePHP 配置 1. 数据库配置: 会将数据库配置放到 app/config/database.php 中。app/config/目录下默认的只有 database.php.default 文件,可以复制一份并命名为 database.php,配置后的内容如下: 找到$default, 设置其中的参数。 2. 全局配置 app/config/core.php,如果希望设定 cakePHP 的全局变量,首先需要了解 cakePHP 的配置类 Config。 2.1 了解 Config 配置类,参考 http://book.cakephp.org/cn/view/42/The-Configuration-Class 2.2 了解 CakePHP core.php 中设定的内容,core.php 中定义的全局变量: a) debug, 设定调试的级别 b) c) d)

session 配置 cookie 配置 security.salt 配置,需要改几个字符

e)

acl

3. 利用 App::import()函数在需要时加载其他的 php 类。类似 C++中的 include() 4. 路由配置: 通称使用 cakePHP 提供的默认路由就可以生成足够漂亮的 url,但是有时候需要设置些特殊 自己的自定义路由。需要了解的话参考 http://book.cakephp.org/cn/view/46/Routes-Configuration URL 样式的默认格式:http://example.com/controller/action/param1/param2/param3 5. 自定义 Inflections:设定对 CakePHP 中的命名规则的特例,比如 resource 是不可数名词,就需要设置 复数的特例为 resource, 当然也可以按照默认的命名规则,将 resource 的复数改为 resources,不过 前者更可取。 6. Bootstrapping: 略 _____________________________以上是 CakePHP 中的配置,了解即可________________________________ PART 3:开发自己的 APPlication,重点内容 [此部分内容介绍 CakePHP 的 MVC 原理,他们的扩展内容,以及 Cake 如果组织 MVC 的配合来完成用户的 url 请求] [此部分内容请重点参考 cakePHP 官方网站手册,建议看英文版] 1. 以及 Cake 如果组织 MVC 的配合来完成用户的 url 请求,以一个具体例子说明: a) b)

用户输入 www.example.com/resource/my_list/recent 服务器的 router 解析 url,将其分解为: webroot: www.example.com Controller: Resource(Controller) Action: Resource->my_list($date = ‘recent’);

c)

服务器利用 dispatcher,解析结果执行去 Resource->my_list(‘recent’)函数;

d)

服务器执行到 my_list(‘recent’)中的某一段程序,请求叫 Resource 的 Model 类去读取数据库中 resource 表中最近添加的记录;


e)

f)

g)

ResourceController 获取到这些数据后,利用 Set()函数去将获取到的数据传递给指定的 Action 视图文 件 views/resource/my_list.ctp。最后,完成数据传递后,my_list()函数根据设定的 layout 文件,显性 调用或自动调用 render()函数去生成 HTML 代码。 服务器调用指定的 layout 文件(默认为 views/default.ctp),然后再去生成前面提到的 Action 视图文 件,并将生成的结果传递给此 layout 文件的$content_for_layout,最后将生成的静态 HTML 文档,连 同指定的图片文件、css 文件和 javascript 文件,发送给用户的浏览器; 用户享受传递回来的网页。

2. Controller 控制器 controller 是用来控制逻辑的。通常,一个 controller 会来控制一个独立的 model。例如 ResourceController 会自动地获得对 Resource(Model)的控制。当然也可以设定 Controller 中的成员变量的值,来更改或增加 对其他 Model 的控制。 除了 controller 中的成员变量(属性外),Controller 中最重要的是定义在其中的 Actions,每个 Action 用来 响应具体的一个 url 请求,然后去请求 Model 读取数据,最后将获得的数据传递给指定的 view 文件。 定义自己的 App Controller: /app/controllers/resource_controller.php <?php class ResourceController extends AppController { //核心属性定义 //actions 其中可以调用 AppController 中的核心函数 } ?> 为了获得对 controller 的全部功能,最重要的是了解它已经包含的一些核心属性和函数 [如果要详细了解,请直接参考/cake/lib/controller/controller.php 源文件,这个比官方网站的 API 手册更 容易理解] 1. 核心属性: 1. $name //Controller 的名称 PHP4 的用户如果要定义控制器必须从$name 的属性开始。$name 属性是控制器的名字。PHP5 不需要遵守这样的规则,但是为了兼容 PHP4,不用忘记定义$name 属性。 e.g. $name = ‘Resource’; 2. $components, $helpers, $uses 定义 Controller 可以使用的 components, helpers 和 models e.g. $components = array (‘Email’, ‘Session’); $helpers = array(‘Html’, ‘Javascript’, ‘Module’); $users = array(‘Resource’, ‘User’); 3. 与页面相关的属性: $layout,$pageTitle 在某个具体的 action 里面,设定 layout 文件和 layout 文件里的$title_for_layout(html 文档的标题). e.g. $this->layout = ‘ajax’; $this->pageTitle = ‘AJAX 请求响应’; 4. 参数属性 ($params) 请参考 http://book.cakephp.org/cn/view/51/Controller-Attributes # 3.5.2.4 参数属性 ($params) $this->form[‘date’]; 2. 核心函数:


1. set():用于将数据传给 view 文件 2. render():渲染视图文件 3. redirect():定向到新的 url 4. flash():与 redirect()类似 5. callbacks: beforeFilter(), beforeRender(), afterFilter(), afterRender() 6. disableCache 7. postConditions 3. Component 组件 component 是封装了一定逻辑处理的,可以在 controller 间共享使用的包。当你发现你总是需要在不同的 controller 间来回拷贝代码的时候,也许就是时候把这些可以共有的代码打个包,写成 component 了。 1. CakePHP 已经提供了相当多的核心 component: Security, Sessions, Access control lists, Emails, Cookies, Authentication, Request handling 很多的核心组件需要被配置. 下面是一些需要配置的组件 Auth, Cookie and Email. 所有这些组件的 配置都在控制器(Controller)的 beforeFilter()方法中完成. 2. 创建自定义的 Component:要做的第一步是创建一个新的组件的类和保存该类的文件。创建 /app/controllers/components/math.php 文件。文件的内容看起来大概是下面这个样子。 class MathComponent extends Object { //使用其他的 components $components = array(...); function doComplexOperation($amount1, $amount2) { return $amount1 + $amount2; } //如果要在组件中访问控制器的实例(instance),需要实现组件的 initialize()(或者 startup()) 方法。 //在 Controller::beforeFilter()之前被调用 function initialize(&$controller) { // saving the controller reference for later use $this->controller =& $controller; } } [本部分的最大重点是学会后面 CakePHP 提供的核心 components,同时了解如何自定义 component] 4. Model 模型 模型是数据的表现,在 CakePHP 中被用来进行数据的访问。通常情况下一个模型对应一张数据库表,不 过也可以用来访问其他的数据容器,比如文件,LDAP 记录,iCal 事件或者 CSV 文件的行。 一个模型可以与其他的模型建立相互的关系。 模型最重要的是将数据库中的表抽象为面向对象中的类,并且,所有模型的基类 AppModel 提供了方便 的对数据库的操作方法,这样,只需要建立一个数据库和其中的表,并且按照 CakePHP 的命名规则定义了相 应的 Models,以后就不需要去关心如何去直接操作数据库中的记录,只有通过 Model 中已经有的操作方法间 接地操作数据即可。 [本部分的重点是:掌握如何写自定义的 Model 类,如何定义 Model 类之间的关系来反映关系型数据库的中 的关系,最后掌握如何通过 AppModel 基类已经提供的数据操作方法,使相应的 Controller 类获得对数据的获


取等操作,以及如何在自定义的 Model 类中,定义一下高级的数据操作方法,供 Controller 来调用,以减少 Controller 类的体积] 1. 模型,即数据模型,在面向对象的程序中表示一件“东西”。通过 CakePHP 中的 Model 概念,方便地将关系 型数据库中的表抽象为面向对象中的类,更容易理解,且更容易操作。 通过简单的定义一个与数据库中表对应的 Model,e.g. 数据库中有个 resource 表,则定义: //路径:/app/models/rescource.php class Resource extends AppModel { $name = ‘Resource’; } 仅仅简单地定义了这样一个 Resource Model,通过继承 AppModel 类,就获得了对 resource 表的 CRUD 操 作(C: create, R: read, U: update, D: delete)。比如: 在 ResourceController 中的某个 Action 中就可以直接操 作: $this->Resource->find(‘all’); 2. 模型中的核心操作方法 a)

参考 http://book.cakephp.org/cn/view/73/Retrieving-Your-Data # 3.7.3 获取数据 [所有的获取数据的方法的返回结果为一个定义良好的 PHP 数组] find($type, $params) $type 可以是'all','first','count','neighbors','list'或者'threaded'的其中之一。默认情况下 会使用'first'进行查找。 $params 是一个下面所列出的选项作为 key 的数组: array( 'conditions' => array('Model.field' => $thisValue), //条件数组 'recursive' => 1, //整型 'fields' => array('Model.field1', 'Model.field2'), //字段名数组 'order' => 'Model.created', //定义顺序的字符串或者数组 'group' => array('Model.field'), //进行 GROUP BY 的字段 'limit' => n, //整型 'page' => n //整型

) query(string $query) query()函数被设计用来执行自定义的 SQL 语句。 generateList(string $conditions, string $order, int $limit, string $keyPath, string $valuePath) 获取一个 key-value 的集合数组 b)

保存数据:http://book.cakephp.org/cn/view/75/Saving-Your-Data # 3.7.4 保持数据 在 CakePHP 中保存数据是非常容易的事。通常情况下是把具有如下基本形式的数组传递给模型的 save()方法来完成 save(array $data = null, boolean $validate = true, array $fieldList = array()) create(array $data = array()) 该方法重置模型的状态信息以使得新的记录得以保存。


saveField(string $fieldName, string $fieldValue, $validate = false) 该方法被用来保存单个字段。在调用 前请设置模型的 ID($this->ModelName->id = $id)。使用该方法时,$fieldName 应该只包含字段名,而 不是模型名加字段名。 updateAll(array $fields, array $conditions) 在一次调用中更新多条记录。将被更新的记录用$conditions 数组定义,字段的值会按照$fields 的定义进行更新。 saveAll(array $data = null, array $options = array()) 用来保存(a)单个模型的多条独立记录,(b)该记录以 及所有相关记录。 向 hasOne,belongsTo 和 hasMany 关联的模型中保存数据是很简单的:你只需要通过外键找到关联 模型的 ID,然后调用 save()方法,就一切完事了。 对于 HABTM(hasAndBelongsToMany),需要在数据中设置关联模型的 ID 来完成。[此部分我也不太了 c)

解,请查看官方网站的手册的相应章节] 删除数据,最简单的部分,仅有两个简单的函数 del(int $id = null, boolean $cascade = true); 删除通过$id 指定的记录。默认情况下也同时删除依存于该 记录的记录。 deleteAll(mixed $conditions, $cascade = true)

与 del()和 remove()一样,不过 deleteAll()会删除所有满足条件的记录。$conditions 应该是 SQL 的条件 语句或者条件数组。 3. 定义 model 之间的关系 参考:http://book.cakephp.org/view/78/Associations-Linking-Models-Together CakePHP 中的 4 种关系 1 – 1:

hasOne

1 -- *: * -- 1:

hasMany belongsTo

* -- *:

hasAndBelongsTo

[以下内容将以实例为重点] [attention: 要记住关联只定义了'一边'。如果定义了 User hasOne Profile,对于 Profile 模型是没有效果的。需 要在 Profile 模型中定义 Profile belongsTo User 才能访问 User 模型, 这个规则同样适用于 hasMany 和 hasAndBelongsToMany] 1. hasOne Association 比如 a user hasOne profle 所以我们需要这样定义 User Model class User extends AppModel { $name = ‘User’; $hasOne = array ( ‘Profile’ => array ( ‘className’ => ‘Profile’, ‘foreignKey’ => ‘user_id’, //默认是 model_name_id, 所以如果在数据库表 中遵守了这个命名规则,不需要明确定义。 ‘conditions’ => ‘Profile.school = “浙江大学”’, //查询条件,默认情况下,当 我们查找一个 user 记录时, cakePHP 同时会将与之关联的其他的记录也返回, 这里就会同时返回一条 profile 记录。 ‘fields’ => ... //取回关联模型数据的字段列表。默认返回全部。


‘dependent’ => true; 默认为 true,当设为 true 时,删除一条 user 记录, 同时会删除关联的 profile 记录。要使递归删除生效,Model->delete()方法的 第二个参数必须设置为 ture。 )); } 2. hasMany Association 比如 a user hasMany goals,于是就需要定义 class User extends AppModel { $name = ‘Users’, $hasMany = array ( ‘Goal’ => array( ‘className’ => ‘Goal’, //与 hasOne 中定义相同的内容意义也相同,以下不再说明 ‘foreignKey’ => ‘user_id’, //‘conditons’ //’fields’ ‘order’ => ‘Goal.id DESC’, //SQL 代码段,定义返回的关联数据的排序。 ‘limit’ => 10, //返回的关联数据的最大行数。默认返回全部 ‘offset’ => 0, //在读取和关联之前需要跳过的关联记录的行数(以当前的条件和排序为 准)。默认 0 ‘dependent’ => true )); } 3. belongsTo Association 比如 Goal belongsTo User Class Goal extends AppModel { $name = ‘Goal’, $belongsTo = array( ‘User’ => array( //className, ‘foreignKey’ => ‘user_id’, //conditions //fields ‘countCache’ => true, //默认为 false, 设为 true 后,当执行 save()或 delete()操作时,关 联模型会自动增加或减少外部表中“[singular_model_name]_count”(本例中为 goal_count)字段的 值。如果值为字符串,则表示该字段的名称。记数字段的值代表关联记录的数量。 ‘countScope’ => ‘Goal.status = 3’, //用于更新记数器缓存字段的条件数组(可选)。 )); } 4. hasAndBelongsToMany HABTM Association 比如一个用户可以和其他用户成为好友 Class User extends AppModel { $name = ‘User’, $hasAndBelongToMany = array ( ‘User’ => array (


‘className’ => ‘User’, ‘joinTable’ => ‘friendship’, //用以关联两种表的中间表 ‘with’ //Defines the name of the model for the join table ‘foreignKey’ => ‘user1’, //指向本 model: 绿色 User 'associationForeignKey' => 'user2', 'unique' => false, //If true (default value) cake will first delete existing relationship records in the foreign keys table before inserting new ones, when updating a record. So existing associations need to be passed again when updating. 'conditions'

=> '',

'fields' 'order'

=> '', => '',

'limit' 'offset' 'finderQuery'

=> '', => '', => '',

'deleteQuery' 'insertQuery'

=> '', => ''

)); } [说明, 在我们的网站应用时,定义 HABTM 反而会增加复杂度,在这里我们不会定义一个用户到用 户的 HABTM 关系,而改为一个用户 HasMany Friendship,定义其字段为 id, user_id, friend_id,当然, 这样,对于两个互为好友的用户来说,实际上 Friendship 中会保持两条记录] 4. 了解 CakePHP 还可以动态地添加 删除关系 bindModel() and unbindModel() 5. 与 Controller 一样,Model 也具有回调函数供使用: beforeFind(), afterFind(), beforeValidate(), beforeSave(), afterSave(), beforeDelete(), afterDelete(), onError(). 6. Model 中的核心属性 1. useDbConfig 属性,字符串,指定数据连接的名称,绑定 Model 类和关联的数据表。可以设置为 数���库配置文件里面的任意数据库连接。数据库配置文件路径为/app/config/database.php。也就是 说,如果在 database.php 文件中定义了多个数据库连接,就可以通过定义$useDbConfig 属性来更改 默认的’default’数据库连接。 2. useTable 属性指定数据表名称。默认情况下模型使用小写的、复数的模型类的名称作为其值,否 则请设置该属性为实际的表名,如果不使用数据表,请设置该值为 false。 3. 每张前通常都有一个主键 id。可以改变该字段名使用其它值作为模型的主键。想使 CakePHP 使用 一张已经存在的数据表时非常有用。 4. 递归属性定义了 CakePHP 在使用 find(),findAll()和 read()方法获取关联模型数据时的深度。 假设应用程序有这样一个场景:组属于一个域,组里面又有很多用户,而用户又有很多文章。 就可以在使用$this->Group->find()调用时设置$recursive 参数为不同的值来获取你想要的数据: 深度 描述 -1 Cake 仅获取组数据,无表连接。 0

Cake 将获取组数据及它的域

1

Cake 将获取一个组、它的域以及它关联的用户

2 Cake 将获取一个组、它的域,它的关联用户,以及这些用户的关联文章 3. 4. ... 不要设置得此值高于你的需求。没必要让 CakePHP 去获取你不需要的数据而影响你的程序速度。


5. order 所有 find 操作结果数据的默认顺序 6. data 存放模型取得数据的地方。model 类返回的数据通常也被用作 find()调用的返回值,在 model 的回调函数中,你可能需要使用$data 来访问这些信息。 7. validate 该属性定义了一组规则允许模型在数据保存前进行校验。 注意:在 save()之前没有必要调用 validate(),因为 save()在实际保存前会自动校验数据。 8. cacheQueries 如果设置为 true,model 获取的数据在单个请求中会被缓存。该缓存仅在内存中, 只持续至整个请求过程结束。任何对同样数据的重复请求均由缓存进行处理。 6. 自定义方法与属性 5. Behavior 不需要了解 6. View 部分和 Helpers 部分为页面设计部分,由页面设计人员学习即可,不需要学习,只有知道,view 文件 中定义了一下变量入口,Controller 中的 Action 就是将数据传递给这些变量入口,最终将 View 文件 渲染为 HTML 代码,完成 url 的响应。 7. 插件 plugins 了解 CakePHP 允许将创建的控制器、模型和视图联合起来打包发布,作为其它 CakePHP 程序可以使用的 插件。在应用程序中有比较棒的用户管理模块?或者简单的博客?抑或 web services 模块?将它打 包成插件就可以在其它程序中使用了。 插件与安装它的应用程序之间最主要的联系是应用程序的配置(如数据库连接等等)。否则,它只 会对它自己的领空生效,就像一个独立的应用程序一样。 _____________________以上是 CakePHP 中的核心内容,必须完全掌握________________________________ PART 4:CakePHP 的核心类库: Helpers 和 Components,只包含我们需要的内容,重要的内容 实际上,PHP 本身已经支持了强大的内部函数来完成 session 管理,cookie 管理,发送 email,不过 CakePHP 提供的 ACL component 等也相当有用。 Acl Acl 组件提供更简单的方式使用基于 ini 文件和数据库的接口来存取控制列表。 、 Auth 认证组件可以使用各种认证方式如 Controller 回调,ACL 或者 Object 回调来使用认证系统。 Session 会话组件是 PHP 的 Session 的包装器 RequestHandler RequestHandler 分析访问者的请求,然后告诉应用程序关于这些请求的信息如 Content Type 等。 Security 安全组件允许你做更严格的安全设置和管理 http 认证。 Email 使用多种邮件传输代理发送邮件,包括使用 php 的 mail()和 smtp。 Cookie Cookie 组件类似 SessionComponent,可以理解为 PHP Cookie 的一个包装器。 具体请查看:http://book.cakephp.org/cn/view/170/Core-Components PHP 的另一个核心类库 Helpers,主要用于协作生成 view 文件代码,所以开发网站逻辑的人员不了解也没关 系 我们会用到的一些 Helpers 包括:HTML javascript Form. 我们只用到一点点 Helpers 的内容,大量的工作会由 jQuery 完成 Ajax 请求, 用自定义的 moduleHelper 来生成 module HMTL 代码 ___________以上是 CakePHP 中的重要内容,为了快速开发,必须掌握 Cake 提供的核心类库_________________ 附:CakePHP 的 21 个技巧


cakephp in footward