CakePHP


一、什么是CakePHP

CakePHP 是一个基于PHP,免费且开源的迅速发展框架。它提供程序员所需要的基本体系架构,因此程序员可以使用它更快速且不失灵活性地创建网络应用程序。而这就是我们创造 CakePHP 的首要目的。

大家对网络开发那千篇一律的步骤或许感到厌烦了。CakePHP 因此提供了开发一个网络程序时所需要的所有工具,您这时只需要编写程序里的详细逻辑就可以了。那每当您要开始一个新的程序的时候,您只需要把 CakePHP 给拷贝一份,接着就可以迅速地开始开发您的程序了。

CakePHP 拥有一个活跃的开发团队以及社区,使 CakePHP 本身更具备应有的价值。另外,使用 CakePHP 也意味着您的应用程序将更容易地测试以及更容易地被改良、更新。

使用 CakePHP 的好处:

  • 拥有既友好又活跃的社区
  • 灵活的MIT 许可证
  • 兼容 PHP4 和 PHP5
  • 数据库交互运用了 CRUD
  • 应用程序脚手架
  • 代码自动产生(代码产生器)
  • MVC 体系架构
  • 清晰,干净的高度自定义的URLs和路由请求分发器
  • 内建validation验证
  • 快速灵活的模板机制 (PHP syntax, with helpers)
  • 拥有AJAX, JavaScript, HTML表单和更多的视图助手工具
  • 邮件、Cookie、安全、会话(Session),和请求处理的组件
  • 灵活的ACL访问控制机制
  • 数据清理
  • 灵活的视图缓存Caching
  • 本地化
  • 可在任何子目录里工作,很少甚至不需要更改任何 Apache 相关配置

二、理解MVC(Model-View-Controller)模式-视图-控制器

CakePHP遵循MVC软件开发模式。 程序开发设计使用MVC分开你的应用程序为三个主要的部分:

  1. 模型(Model):就是封装数据和所有基于对这些数据的操作。
  2. 视图(View):就是封装的是对数据显示,即用户界面。
  3. 控制器(Control):就是封装外界作用于模型的操作和对数据流向的控制等,简单来说就是负责处理和分发客户的请求。
图一

图示 1:就是一个基本的MVC请求

图示 1显示了一个在CakePHP中的大概的MVC请求范例。举例说明,假设一个名叫"Ricardo"的客户刚刚点击了一个“现在购买一个客户自定义的Cake!”的链接在你的应用程序页面。

  • Ricardo 点击一个链接指向 http://www.example.com/cakes/buy, 并且他的浏览器向你的web server发送了一个请求。
  • 接着这个分发器检查 URL (/cakes/buy)请求,并且协助这个请求指到正确的控制器。
  • 这个控制器就会执行特定的应用程序逻辑。例如,他将检查看Ricardo是否已经登陆。
  • 这个控制器也使用模式去获得应用程序数据层的数据。模式通常展现数据库表,但是他们同时也展现(呈现) LDAP(轻量级目录访问协议)入口 entries, RSS feeds, 或者系统文件。在这个范例中, 这个控制器使用了一个模式(model)从数据库中去抓取、撷取Ricardo的最近的订单。
  • 一旦控制器已经开始魔法似的处理那些数据,他支配了那些数据成为一个视图。 视图的得到这个数据并且让它为展现给客户准备好。 在CakePHP视图通常是使用HTML格式, 但是一个视图应该能够很容易的成为一个 PDF, XML 文档, 或者 JSON 对象依赖于你的需求。
  • 一旦视图从控制器中获得数据就会呈现一个完成的编译好的视图给大家,那个视图的内容将会被返回到Ricardo的浏览器。

三、CakePHP的结构
控制器 (Controller),模型 (Model) 及视图 (View) 是 CakePHP 的特色,除此之外它也包含了一些附加的类和对象,使得在 MVC 设计模式下开发更快更有乐趣。组件 (Component)、行为 (Behavior) 及助手 (Helper),提供了可扩展性及可重用性来快速新增功能到你的应用中。

组件 (Component) 是一个帮助简化控制器逻辑的类。如果你有一些想要在控制器(或应用程序)之间共享使用的逻辑,那么组件通常是很适合的。比如,框架核心提供的 EmailComponent 组件使得创建及发送 email 成为一个轻松的工作。所以并不是在一个控制器内编写发送 email 的方法,而是包装这样的逻辑以便在整个应用中被其他控制器共享使用。

控制器也同样配有回调函数(Callback)。当你需要在 CakePHP 核心操作之间插入一些逻辑时,可利用这些回调函数。可利用的回调函数包括:

  • beforeFilter(), 在所有的控制器动作逻辑开始之前执行
  • beforeRender(), 在控制器动作逻辑之后执行,但在视图输出之前
  • afterFilter(), 在所有的控制器动作逻辑之后执行,包括视图输出。 也许在 afterRender()afterFilter() 之间没有什么不同,除非你手动在你的控制器动作之中呼叫 render() 及此后的包含一些逻辑操作。

助手 (Helper) 是用来辅助视图逻辑的类。与组件在控制器中的使用非常类似,助手允许在多个视图中存取及共享显示逻辑。其中一个核心助手是,AjaxHelper,它使得在视图中请求 Ajax 变得十分简单

大多数的应用程序都会有许多重复使用的视图代码片段。CakePHP 使用布局 (layout) 及元素 (elements) 使得重用视图代码更为容易。预设的情况下,每个被控制器渲染的视图都出现在一个布局内。元素被使用在当小片段代码的内容需要被重用在多个视图的时候。

 

行为 (Behavior) 是用来在模型之间加入共用功能。举例来说,如果你将用户资料储存在树结构中,你可以具体指定你的 User 模型使用像树结构的行为,并获得在你的树结构中自由操作移除、新增和搬移节点的功能

模型 (Model) 也支持另一个叫做 DataSource 的类。DataSource 是一个让模型以一致的方式操作不同类别数据的抽象层。虽然在 CakePHP 应用中主要的数据来源通常是数据库,但你也可以编写附加的 DataSource 来使模型表达 RSS feeds、CSV 文件、LDAP 目录数据 或 iCal 事件。DataSources 允许你从不同的数据来源来操作记录,而不只限制在使用 SQL 语句。DataSources 也允许你通过 LDAP 模型关联到许多 iCal 事件。

就像控制器一样,模型也有使用回调函数的特性:

  • beforeFind()
  • afterFind()
  • beforeValidate()
  • beforeSave()
  • afterSave()
  • beforeDelete()
  • afterDelete()
透过这些回调函数的名称,就应该可以了解它们的作用。

控制器 (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 插件

继续之前的请求的例子,想象一下我们的朋友Ricardo刚刚在一个CakePHP的应用的首页上点击了“立刻买一个自定义的蛋糕!”这个链接。

图2. 典型的Cake请求。

黑色 = 请求的元素, 灰色 = 可选的元素, 了;蓝色 = 回调方法

  1. Ricardo 点击了指向 http://www.example.com/cakes/buy 的链接, 然后他的浏览器对你的服务器发出了一个请求。
  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的浏览器了。



posted @ 2009-09-15 15:06  {yan}  阅读(1718)  评论(2编辑  收藏  举报