1.下载:http://cakephp.org/ 下载最新的稳定版本
2.解压:
认识目录结构:
index.php
app ---你放置应用程序的地方
lib ---框架核心部件,请不要修改这个资料夹里的所有档案
plugins ---可以放置你要在应用程序中使用的第三方插件
vendors ---可以放置你要在应用程序中使用的第三方PHP程序库
认识项目目录结构 app
App目录 CakePHP的app目录将是开发应用程式时最常使用的一个
Config 配置目录
Console
Controller 放置所有的控制器
Component 放置控制器的帮助如果你有一些想要在控制器之间共享使用的逻辑,那么组件通常是很适合的。
Lib 放置你自己的内部库文件不是第三方的
Locale 用来存储国际化的文件
Model 放置数据模型
Plugin 放置插件或者第三方程序
Test
tmp 用来放置cakephp的临时数据
Vendor 放置当前项目中所有第三方类库 App::import('vendor','name')来使用他们
View 展示层文件放置在这里
elements 放置一些重复的较小的布局组件 layout
errors 放置错误模板文件
helpers 助手允许在多个视图中存取及共享显示逻辑。其中一个核心助手是,AjaxHelper,它使得在视图中请 求 Ajax 变得十分简单。
layouts 布局文件
pages 放置视图文件
webroot 在产品安装模式下这个目录是应用程序的根目录,包含了样式表、图片、js等文件
css
files
img
js
.htaccess
index.php cake中有三个该文件,方便用户用不同的方法配置cake
三、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的配置
3、基本概念
1 MVC模式
为了更好的理解类似Cake的web程序,你需要了解一些 Ruby on Rails这个框架,Cake的灵感就来自于Ruby on Rails。Ruby on Rails是编程语言Ruby的网站开发框架。它实现了Active Record和MVC模式。
MVC模式,将一个项目,甚至是一个接口分成三个部分:model,view和controller。开发MVC是为了将传统的输入,处理,输出映射到GUI领域
Input -> Processing -> Output
Controller -> Model -> View
四、命名规范
CakePHP的命名规则从许多开发者多年的经验及一些惯例筛选出来。
控制器命名规范:
控制器的类别名称是复数,使用驼峰命名法,并在最后加上Controller 。PeopleController和LatestArticlesController ,都是控制器命名规则的例子。
你给控制器Controller写的第一个方法应该是index()。当一个请求指定一个控制器Controller但没有指定方法时,
CakePHP会默认执行那个控制器Controller的index()方法。
例如:
http://www.example.com/apples/ 请求将映射至ApplesController的index()方法
http://www.example.com/apples/view/ 会映射至ApplesController的view()方法。
你也可以给控制器的方法名前加下划线来改变控制器能见度。如果一控制器的方法名前已加上下划线,这个方法就不能直接通过 web来访问但是可以通过内部调用。
例如:
<?php
class NewsController extends AppController {
public function latest() {
$this->_findNewArticles();
}
protected function _findNewArticles() {
// Logic to find latest news articles
}
}
网页http://www.example.com/news/latest/ 能够访问,而http://www.example.com/news/_findNewArticles/ 将会显示错误,因为方法名前面有下划线。你也可以通过PHP的访问修饰符来表明一个方法可否由URL来访问。非Public方法不能访问。
文件及类名称命名规范
控制器类KissesAndHugsController会被命名为 KissesAndHugsController.php
组件类MyHandyComponent会被命名为 MyHandyComponent.php
模型类OptionValue会被命名为 OptionValue.php
行为类EspeciallyFunkableBehavior会被命名为 EspeciallyFunkableBehavior.php
视图类SuperSimpleView会被命名为 SuperSimpleView.php
助手类BestEverHelper会被命名为 BestEverHelper.php
每个文件都会被放置于app目录下适当的子目录中
模型及数据库命名规范:
模型类别名称是单数且使用骆驼命名法。Person、BigPerson和ReallyBigPerson都是模型命名规范的例子。
数据库中的表命名和模型命名基本一致,如果是复数用底线分割单词,数据表名称Persons、big_people和 really_big_people,会各自与上述的模型对应
你的数据库中的表也应该遵循下面的命名规则:
cake使用的表名(Table name)应该有英文的复数形式组成,比如users, authors, articles. 注意,对应的model是单数形式
所有的表 都必须有一个主键叫做 id
视图文件的命名规范:
视图文件以下划线分隔形式命名。例如:在 PeopleController 中 getPeady() 方法将调用对应的视图文件 /app/View/People/get_ready.ctp
/app/View/控制器/fun.ctp
配置你的数据库
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的全局配置可以在/app/config/core.php
DEBUG: 调试配置 1 2
路由配置:
Router::connect('url', array('controller' => '控制器名', 'action' => '函数名',['特定参数']),'视图名');
控制器:
Controller用来管理应用程序某个部分的逻辑。最常见的是,Controller用来管理单个model的逻辑。
应用程序的controller类扩展了Cake的AppController类,而AppController又扩展了核心的Controller类。Controller可以包含任何数量的动作:在Web应用程序中应用的函数来显示视图(view)。一个动作就是一个controller的单独功能。
1.CakeRequest对象主要负责以下几个功能:
处理GET,POST,FILES数组,并以对象形式返回这些数据
提供发起请求的客户端相关信息,如headers,客户端IP地址,域名信息
提供获取请求参数的方法,包括数组及对象属性。
获取请求参数
CakeRequest提供了多个接口用于获取请求参数
1.1下面的三种方式都能获取到当前请求的控制器名
$this->request['controller']; //第一种方式是通过对象属性的形式
$this->request->controller; //第二种通过数组索引的形式
$this->request->params['controller']; //第三种通过$this->request->params
1.2检查请求
$this->request->is('post');
$this->request->isPost();
is(‘get’) Check to see if the current request is a GET.
is(‘put’) Check to see if the current request is a PUT.
is(‘post’) Check to see if the current request is a POST.
is(‘delete’) Check to see if the current request is a DELETE
is(‘head’) Check to see if the current request is HEAD.
is(‘options’) Check to see if the current request is OPTIONS.
is(‘ajax’) Check to see of the current request came with X-Requested-with = XmlHttpRequest.
is(‘ssl’) Check to see if the request is via SSL
is(‘flash’) Check to see if the request has a User-Agent of Flash
is(‘mobile’) Check to see if the request came from a common list of mobile agents.
最常使用的请求参数还有URL中的普通参数
$this->request['pass']
$this->request->pass
$this->request->params['pass']
//named parameters
$this->request['named']
$this->request->named
$this->request->params['named']
plugin 处理当前请求的插件,没有则返回null
controller 处理当前请求的控制器
action 处理当前请求的控制器方法
prefix 当前控制器的前缀。如admin_edit。在路由中配置。
bare 通过requestAction()发起的请求包含的参数。
requested 当请求来自requestAction()时,值为true。
获取查询字符串(QueryString)参数
$this->request->query['page'];
// You can also access it via array access
$this->request['url']['page'];
获取POST数据
//当一个表单域的name属性为data[Post][title]时,该值可以在提交的控制器中通过如下方式获取
$this-request->data['Post']['title'];
访问XML或JSON数据:
$data = $this->request->input('json_decode');
获取路径信息
$this->request->webroot 包含了当前根目录的路径
$this->request->base 相当于PHP函数中获取的base path
$this->request->here 获取当前请求的完整路径
$this->request->query 包含了查询字符串参数
2、与视图交互
set(string $var,mixed $value);你可以使用它处理任何事情:单个值,整个数组等。一旦你使用了set(),此变量会传递到view里:在Controller设置set('color', 'blue'),这样$color就会在view中可用。
render(string $action ,string $layout,string $file);你可能不会经常使用本函数,因为在每个controller动作的结束之时,会自动调用rende
用户转向
edirect(string $url);使用本函数会告诉你的用户去哪里。这里传入的URL可以是Cake的一个内部URL,也可以是一个完整有效的URL(http://...)
flash(string $message,string $url,int $pause);本函数在你的flash布局(layout,可在 app/views/layouts/flash.thtml找到)里,显示$message此消息$pause秒钟,然后用户转向到指定的$url.Cake的redirect()和flash()函数没有包含exit()的调用。如果你打算让你的应用程序在redirect()或flash()停止,你自己需要在后面立即调用exit(),这取决于你的情况(例如,如果你需要执行某些回调)
beforeFilter();在每个Controller动作之前调用。它的一个有用之处就是用来检验活动的对话(session)以及角色。
afterFilter();在每个Controller动作之后调用。
beforeRender();在view render之前,controller逻辑之后调用
requestAction(string $url,array $options);你可以使用requestAction从另外的controller动作里获取数据,或者从一个controller得到整个已经render的view。
应用举例: 假设我们有用户控制器,下面有获取用户列表的方法,在另外一个控制中调用该方法并render
class UsersController extends AppController
{
function getUserList()
{
$this->User->findAll(); //user表获取所有的用户
}
}
假设我们需要创建一个简单的表来显示系统里的用户
class ProductsController extends AppController
{
function showUserProducts()
{
$this->set('users', $this->requestAction('/users/getUserList'));
}
}
如果在你的非静态的应用程序中有一个经常使用的元素,你可能会使用requestAction()将它插入到view里。实际上,我们想在另外的一个controller里面render动作的view(它可能包含由一个表组成)。你会省略重复的view代码。
class ProgramsController extends AppController
{
function viewAll()
{
$this->set('userTable', $this->requestAction('/users/getUserList', array('return')))
}
}
postConditions(array $data)
例如,如果我有一个查找某人的表单:
app/views/people/search.html
<?php echo $html->input('Person/last_name'); ?>
提交此带有此元素的表单,会有如下$this->data的数组:
Array
(
[Person] => Array
(
[last_name] => Anderson
)
)
这时候,我们可以使用postConditions()来格式化本数据,并在model中使用:
app/controllers/people_controller.php:
$conditions = $this->postConditions($this->data);
$this->Person->findAll($conditions);
3、Controller 变量
$users;
你的Controller是否使用多个model呢?
FragglesController会自动加载$this->Fraggle,但是如果你也想访问$this->Smurf,试试将下面的东东加到你的controller中:
var $uses = array('Fraggle','Smurf');
$helpers
使用本变量可以让controller把 helper加载到它的view中去。HTML helper会自动加载,但是你可以使用本变量指定其他的:
var $helpers = array('Html','Ajax','Javascript');//记住,如果你打算用它的话,你需要在$helpers数组中包含HtmlHelper。
$layout
将本变量设置为你想在controller中使用的布局名。
$beforeFilter
如果你想让你的一点点代码在每次的action调用中都运行(和任何动作运行之前),使用$beforeFilter吧.此东西对访问控制来说真的非常好-你可以在任何动作发生前检查用户的权限。将此变量设置为一个包含controller 动作的数组。可以如下运行:
class ProductsController extends AppController
{
var $beforeFilter = array('checkAccess');
function checkAccess()
{
//Logic to check user identity and access would go here....
}
function index()
{
//在index()之前调用 checkAccess().
}
}
$components
与$helpers和$uses一样。此变量用来加载你需要的组件:
var $components = array('acl');
Controller参数:
在Cake controller中,Controller的参数在$this->params 中。本变量用来把数据放入controller里,并且提供访问当前请求的信息。$this->params最常用的使用方法是访问已经通过POST或GET传递到Controller的信息。
$this->data
用来处理从HTML Helper表单到controller的POST数据。
在视图中
$html->input('User/first_name'); 等价于<input name="data[User][first_name]" value="" type="text" />
在控制器中
$this->data['User']['first_name']
$this->params['form']所有表单的POST数据都存储在这里,包含在$_FILES发现的信息。
$this->params['bare']如果当前的布局没有的话设置为1,否则为0
$this->params['ajax']如果当前的布局是ajax,存储1,否则为0
$this->params['controller']存储当前处理请求的controller名。例如,如果调用URL /posts/view/1,$this->params['controller']等于"posts".
$this->params['action']存储当前处理请求的action名,例如,如果调用URL /posts/view/1,$this->params['action']等于"view"
$this->params['pass']存储当前请求的GET查询字符串。例如,如果调用URL /posts/view/?var1=3&var2=4,$this->params['pass']等于"?var1=3&var2=4".
$this->params['url']
存储当前请求的URL,并伴有get变量的值对。例如,如果调用URL /posts/view/?var1=3&var2=4,$this->params['url']会为:
[url] => Array
(
[url] => posts/view
[var1] => 3
[var2] => 4
)
组件(Component):组件是用来在某些特定的情况下辅助Controller的,组件是一个有点共享性质的控制源,组件针对Controller,而Helper则针对view,而他们的最大不同之处在于组件封装了业务逻辑,而helper封装了表现逻辑。
创建自己的组件:
为了创建一个组件,在app/controllers/components/ directory目录下增加一个文件。
class FooComponent extends Object
{
var $someVar = null;
var $controller = true;
function startup(&$controller)
{
// This method takes a reference to the controller which is loading it.
// Perform controller initialization here.
}
function doFoo()
{
$this->someVar = 'foo';
}
}
现在,为了使用你自己的组件,你需要在你的controller定义中增加如下代码:
var $components = array('Foo');
在Controller里,现在你可以使用:
$this->Foo->doFoo();
组件可以访问Controller了,这个controller是通过上面的startup()方法加载的。在Controller::beforeFilter()后会立即调用此方法。它允许你在beforeFilter设置组件属性,组件可以在它的startup()方法上执行beforeFilter。
为了在你的组件里使用model,你可以创建一个新的实例,如下:
$foo =& new Foo();
你也可以在你的组件中使用其他的组件。你需要在你的组件里简单声明一下哪个组件是你想用的。在下面的实例里,它是一个Session(对话)组件。
var $components = array('Session');
Model:
一般来说,model是一个数据库的访问入口,更特殊的是,它是某个特定数据库表会的访问入口。缺省的,每个model使用数据表,此表的表名是它自己的复数形式,例如,‘User‘model使用’users‘表。Model也可以包含数据验证规则,关联信息,以及指定到它使用的表的方法。
User model实例,保存在app/models/user.php
获取数据:
findAll(string $conditions,array $fields,string $order,int $limit,int $page,int $recursive); $conditions 查询条件的意识
find(string $conditions,array $fields,string $order,int $recursive)
findAllBy( string value); 查询特定的字段
field(string $name,string $conditions,string $order)返回一个字符串,即匹配$conditions 条件以及$order顺序的第一个记录的单个字段。
findCount(string $conditions)返回与给定条件匹配的记录数
query(string $query)
execute(string $query)
可以使用model的query()和execute()来执行自定义的SQL调用。两者之间的区别是query()用来执行自定义的SQL查询(返回结果),而execute()用来执行自定义的SQL命令
复杂的查找条件(使用Array)
$conditions = array("Post.title" => "This is a post");
$this->Post->find($conditions);
array("Post.title" => "<> This is a post")就在表达式前增加一个'<>‘。Cake可以解析任何有效的SQL比较操作符,包括匹配表达式,如LIKE,BETWEEN,或REGEX,只要你在表达式或值等操作符之间留一个空格。
IN(…)样式的匹配。查找title为给定值的post可以是:
array("Post.title" => array("First post", "Second post", "Third post"))
在条件中,同样简单增加额外的条件和增加额外的键/值对到数组中:
array
(
"Post.title" => array("First post", "Second post", "Third post"),
"Post.created" => "> " . date('Y-m-d', strtotime("-2 weeks"))
)
array
("Author.name" => "Bob", "or" => array
(
"Post.title" => "LIKE %magic%",
"Post.created" => "> " . date('Y-m-d', strtotime("-2 weeks")
)
)
保存你的数据 save()
删除数据 del(string $id,boolean $cascade);
视图:
一个View就是一个页面模版,通常是在一个动作之后命名。例如,PostsController::add()的视图是/app/views/posts/add.thtml
布局(Layout)
布局文件放在/app/views/layouts. Cake缺省的布局可以由一个新的缺省的布局重写。这个布局在/app/views/layouts/default.thtml.一旦创建一个新的缺省布局,当render页面时,controller view代码就会放在缺省的布局里。
当创建一个布局时,你需要告诉Cake将你的controller view代码放在哪里:为了实现此,确保你的布局为$content_for_layout包含一个位置(可选的,, $title_for_layout)。下面这个例子介绍了缺省的布局是个什么样子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php echo $title_for_layout?></title> $变量_for_layout
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
</head>
<body>
<!-- If you'd like some sort of menu to show up on all of your views, include it here -->
<div id="header">
<div id="menu">...</div>
</div>
<!-- Here's where I want my views to be displayed -->
<?php echo $content_for_layout ?>
<!-- Add a footer to each displayed page -->
<div id="footer">...</div>
</body>
</html>
为了设置布局的标题(title),在controller中最简单的方法是使用$pageTitle controller变量。
help 帮助函数
创建自己的Helper:
你需要在/app/views/helpers创建一个新类。让我们称我们的helper为LinkHelper吧。实际的PHP类文件如下:
/app/views/helpers/link.php
class LinkHelper extends Helper
{
function makeEdit($title, $url)
{
// Logic to create specially formatted link goes here...
}
}
可能需要利用在Cake Helper类里包含的一些函数:
output
string $string
boolean $return = false
决定是否输出或返回一个基于AUTO_OUTPUT(参看/app/config/core.php)和$return值的字符串。你应该使用此方法将所有数据返回到view里。
loadConfig
返回应用程序当前核心的配置以及标签定义。
使用output()格式化我们链接标题以及URL,并将它返回给view。
/app/views/helpers/link.php (增加了逻辑)
class LinkHelper extends Helper
{
function makeEdit($title, $url)
{
// Use the helper's output function to hand formatted
// data back to the view:
return $this->output("<div class=\\"editOuter\\"><a href=\\"$url\\" class=\\"edit\\">$title</a></div>");
}
}
使用自定义的Helper
一旦你已经创建了一个helper,而且将它放入/app/views/helpers/,你需要通过特殊的$helper变量将它包含在你的controller里,
class ThingsController
{
var $helpers = array('Html', 'Link');
}
;
http://cnblog.ecsquid.com/?p=602
2.解压:
认识目录结构:
index.php
app ---你放置应用程序的地方
lib ---框架核心部件,请不要修改这个资料夹里的所有档案
plugins ---可以放置你要在应用程序中使用的第三方插件
vendors ---可以放置你要在应用程序中使用的第三方PHP程序库
认识项目目录结构 app
App目录 CakePHP的app目录将是开发应用程式时最常使用的一个
Config 配置目录
Console
Controller 放置所有的控制器
Component 放置控制器的帮助如果你有一些想要在控制器之间共享使用的逻辑,那么组件通常是很适合的。
Lib 放置你自己的内部库文件不是第三方的
Locale 用来存储国际化的文件
Model 放置数据模型
Plugin 放置插件或者第三方程序
Test
tmp 用来放置cakephp的临时数据
Vendor 放置当前项目中所有第三方类库 App::import('vendor','name')来使用他们
View 展示层文件放置在这里
elements 放置一些重复的较小的布局组件 layout
errors 放置错误模板文件
helpers 助手允许在多个视图中存取及共享显示逻辑。其中一个核心助手是,AjaxHelper,它使得在视图中请 求 Ajax 变得十分简单。
layouts 布局文件
pages 放置视图文件
webroot 在产品安装模式下这个目录是应用程序的根目录,包含了样式表、图片、js等文件
css
files
img
js
.htaccess
index.php cake中有三个该文件,方便用户用不同的方法配置cake
三、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的配置
3、基本概念
1 MVC模式
为了更好的理解类似Cake的web程序,你需要了解一些 Ruby on Rails这个框架,Cake的灵感就来自于Ruby on Rails。Ruby on Rails是编程语言Ruby的网站开发框架。它实现了Active Record和MVC模式。
MVC模式,将一个项目,甚至是一个接口分成三个部分:model,view和controller。开发MVC是为了将传统的输入,处理,输出映射到GUI领域
Input -> Processing -> Output
Controller -> Model -> View
四、命名规范
CakePHP的命名规则从许多开发者多年的经验及一些惯例筛选出来。
控制器命名规范:
控制器的类别名称是复数,使用驼峰命名法,并在最后加上Controller 。PeopleController和LatestArticlesController ,都是控制器命名规则的例子。
你给控制器Controller写的第一个方法应该是index()。当一个请求指定一个控制器Controller但没有指定方法时,
CakePHP会默认执行那个控制器Controller的index()方法。
例如:
http://www.example.com/apples/ 请求将映射至ApplesController的index()方法
http://www.example.com/apples/view/ 会映射至ApplesController的view()方法。
你也可以给控制器的方法名前加下划线来改变控制器能见度。如果一控制器的方法名前已加上下划线,这个方法就不能直接通过 web来访问但是可以通过内部调用。
例如:
<?php
class NewsController extends AppController {
public function latest() {
$this->_findNewArticles();
}
protected function _findNewArticles() {
// Logic to find latest news articles
}
}
网页http://www.example.com/news/latest/ 能够访问,而http://www.example.com/news/_findNewArticles/ 将会显示错误,因为方法名前面有下划线。你也可以通过PHP的访问修饰符来表明一个方法可否由URL来访问。非Public方法不能访问。
文件及类名称命名规范
控制器类KissesAndHugsController会被命名为 KissesAndHugsController.php
组件类MyHandyComponent会被命名为 MyHandyComponent.php
模型类OptionValue会被命名为 OptionValue.php
行为类EspeciallyFunkableBehavior会被命名为 EspeciallyFunkableBehavior.php
视图类SuperSimpleView会被命名为 SuperSimpleView.php
助手类BestEverHelper会被命名为 BestEverHelper.php
每个文件都会被放置于app目录下适当的子目录中
模型及数据库命名规范:
模型类别名称是单数且使用骆驼命名法。Person、BigPerson和ReallyBigPerson都是模型命名规范的例子。
数据库中的表命名和模型命名基本一致,如果是复数用底线分割单词,数据表名称Persons、big_people和 really_big_people,会各自与上述的模型对应
你的数据库中的表也应该遵循下面的命名规则:
cake使用的表名(Table name)应该有英文的复数形式组成,比如users, authors, articles. 注意,对应的model是单数形式
所有的表 都必须有一个主键叫做 id
视图文件的命名规范:
视图文件以下划线分隔形式命名。例如:在 PeopleController 中 getPeady() 方法将调用对应的视图文件 /app/View/People/get_ready.ctp
/app/View/控制器/fun.ctp
配置你的数据库
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的全局配置可以在/app/config/core.php
DEBUG: 调试配置 1 2
路由配置:
Router::connect('url', array('controller' => '控制器名', 'action' => '函数名',['特定参数']),'视图名');
控制器:
Controller用来管理应用程序某个部分的逻辑。最常见的是,Controller用来管理单个model的逻辑。
应用程序的controller类扩展了Cake的AppController类,而AppController又扩展了核心的Controller类。Controller可以包含任何数量的动作:在Web应用程序中应用的函数来显示视图(view)。一个动作就是一个controller的单独功能。
1.CakeRequest对象主要负责以下几个功能:
处理GET,POST,FILES数组,并以对象形式返回这些数据
提供发起请求的客户端相关信息,如headers,客户端IP地址,域名信息
提供获取请求参数的方法,包括数组及对象属性。
获取请求参数
CakeRequest提供了多个接口用于获取请求参数
1.1下面的三种方式都能获取到当前请求的控制器名
$this->request['controller']; //第一种方式是通过对象属性的形式
$this->request->controller; //第二种通过数组索引的形式
$this->request->params['controller']; //第三种通过$this->request->params
1.2检查请求
$this->request->is('post');
$this->request->isPost();
is(‘get’) Check to see if the current request is a GET.
is(‘put’) Check to see if the current request is a PUT.
is(‘post’) Check to see if the current request is a POST.
is(‘delete’) Check to see if the current request is a DELETE
is(‘head’) Check to see if the current request is HEAD.
is(‘options’) Check to see if the current request is OPTIONS.
is(‘ajax’) Check to see of the current request came with X-Requested-with = XmlHttpRequest.
is(‘ssl’) Check to see if the request is via SSL
is(‘flash’) Check to see if the request has a User-Agent of Flash
is(‘mobile’) Check to see if the request came from a common list of mobile agents.
最常使用的请求参数还有URL中的普通参数
$this->request['pass']
$this->request->pass
$this->request->params['pass']
//named parameters
$this->request['named']
$this->request->named
$this->request->params['named']
plugin 处理当前请求的插件,没有则返回null
controller 处理当前请求的控制器
action 处理当前请求的控制器方法
prefix 当前控制器的前缀。如admin_edit。在路由中配置。
bare 通过requestAction()发起的请求包含的参数。
requested 当请求来自requestAction()时,值为true。
获取查询字符串(QueryString)参数
$this->request->query['page'];
// You can also access it via array access
$this->request['url']['page'];
获取POST数据
//当一个表单域的name属性为data[Post][title]时,该值可以在提交的控制器中通过如下方式获取
$this-request->data['Post']['title'];
访问XML或JSON数据:
$data = $this->request->input('json_decode');
获取路径信息
$this->request->webroot 包含了当前根目录的路径
$this->request->base 相当于PHP函数中获取的base path
$this->request->here 获取当前请求的完整路径
$this->request->query 包含了查询字符串参数
2、与视图交互
set(string $var,mixed $value);你可以使用它处理任何事情:单个值,整个数组等。一旦你使用了set(),此变量会传递到view里:在Controller设置set('color', 'blue'),这样$color就会在view中可用。
render(string $action ,string $layout,string $file);你可能不会经常使用本函数,因为在每个controller动作的结束之时,会自动调用rende
用户转向
edirect(string $url);使用本函数会告诉你的用户去哪里。这里传入的URL可以是Cake的一个内部URL,也可以是一个完整有效的URL(http://...)
flash(string $message,string $url,int $pause);本函数在你的flash布局(layout,可在 app/views/layouts/flash.thtml找到)里,显示$message此消息$pause秒钟,然后用户转向到指定的$url.Cake的redirect()和flash()函数没有包含exit()的调用。如果你打算让你的应用程序在redirect()或flash()停止,你自己需要在后面立即调用exit(),这取决于你的情况(例如,如果你需要执行某些回调)
beforeFilter();在每个Controller动作之前调用。它的一个有用之处就是用来检验活动的对话(session)以及角色。
afterFilter();在每个Controller动作之后调用。
beforeRender();在view render之前,controller逻辑之后调用
requestAction(string $url,array $options);你可以使用requestAction从另外的controller动作里获取数据,或者从一个controller得到整个已经render的view。
应用举例: 假设我们有用户控制器,下面有获取用户列表的方法,在另外一个控制中调用该方法并render
class UsersController extends AppController
{
function getUserList()
{
$this->User->findAll(); //user表获取所有的用户
}
}
假设我们需要创建一个简单的表来显示系统里的用户
class ProductsController extends AppController
{
function showUserProducts()
{
$this->set('users', $this->requestAction('/users/getUserList'));
}
}
如果在你的非静态的应用程序中有一个经常使用的元素,你可能会使用requestAction()将它插入到view里。实际上,我们想在另外的一个controller里面render动作的view(它可能包含由一个表组成)。你会省略重复的view代码。
class ProgramsController extends AppController
{
function viewAll()
{
$this->set('userTable', $this->requestAction('/users/getUserList', array('return')))
}
}
postConditions(array $data)
例如,如果我有一个查找某人的表单:
app/views/people/search.html
<?php echo $html->input('Person/last_name'); ?>
提交此带有此元素的表单,会有如下$this->data的数组:
Array
(
[Person] => Array
(
[last_name] => Anderson
)
)
这时候,我们可以使用postConditions()来格式化本数据,并在model中使用:
app/controllers/people_controller.php:
$conditions = $this->postConditions($this->data);
$this->Person->findAll($conditions);
3、Controller 变量
$users;
你的Controller是否使用多个model呢?
FragglesController会自动加载$this->Fraggle,但是如果你也想访问$this->Smurf,试试将下面的东东加到你的controller中:
var $uses = array('Fraggle','Smurf');
$helpers
使用本变量可以让controller把 helper加载到它的view中去。HTML helper会自动加载,但是你可以使用本变量指定其他的:
var $helpers = array('Html','Ajax','Javascript');//记住,如果你打算用它的话,你需要在$helpers数组中包含HtmlHelper。
$layout
将本变量设置为你想在controller中使用的布局名。
$beforeFilter
如果你想让你的一点点代码在每次的action调用中都运行(和任何动作运行之前),使用$beforeFilter吧.此东西对访问控制来说真的非常好-你可以在任何动作发生前检查用户的权限。将此变量设置为一个包含controller 动作的数组。可以如下运行:
class ProductsController extends AppController
{
var $beforeFilter = array('checkAccess');
function checkAccess()
{
//Logic to check user identity and access would go here....
}
function index()
{
//在index()之前调用 checkAccess().
}
}
$components
与$helpers和$uses一样。此变量用来加载你需要的组件:
var $components = array('acl');
Controller参数:
在Cake controller中,Controller的参数在$this->params 中。本变量用来把数据放入controller里,并且提供访问当前请求的信息。$this->params最常用的使用方法是访问已经通过POST或GET传递到Controller的信息。
$this->data
用来处理从HTML Helper表单到controller的POST数据。
在视图中
$html->input('User/first_name'); 等价于<input name="data[User][first_name]" value="" type="text" />
在控制器中
$this->data['User']['first_name']
$this->params['form']所有表单的POST数据都存储在这里,包含在$_FILES发现的信息。
$this->params['bare']如果当前的布局没有的话设置为1,否则为0
$this->params['ajax']如果当前的布局是ajax,存储1,否则为0
$this->params['controller']存储当前处理请求的controller名。例如,如果调用URL /posts/view/1,$this->params['controller']等于"posts".
$this->params['action']存储当前处理请求的action名,例如,如果调用URL /posts/view/1,$this->params['action']等于"view"
$this->params['pass']存储当前请求的GET查询字符串。例如,如果调用URL /posts/view/?var1=3&var2=4,$this->params['pass']等于"?var1=3&var2=4".
$this->params['url']
存储当前请求的URL,并伴有get变量的值对。例如,如果调用URL /posts/view/?var1=3&var2=4,$this->params['url']会为:
[url] => Array
(
[url] => posts/view
[var1] => 3
[var2] => 4
)
组件(Component):组件是用来在某些特定的情况下辅助Controller的,组件是一个有点共享性质的控制源,组件针对Controller,而Helper则针对view,而他们的最大不同之处在于组件封装了业务逻辑,而helper封装了表现逻辑。
创建自己的组件:
为了创建一个组件,在app/controllers/components/ directory目录下增加一个文件。
class FooComponent extends Object
{
var $someVar = null;
var $controller = true;
function startup(&$controller)
{
// This method takes a reference to the controller which is loading it.
// Perform controller initialization here.
}
function doFoo()
{
$this->someVar = 'foo';
}
}
现在,为了使用你自己的组件,你需要在你的controller定义中增加如下代码:
var $components = array('Foo');
在Controller里,现在你可以使用:
$this->Foo->doFoo();
组件可以访问Controller了,这个controller是通过上面的startup()方法加载的。在Controller::beforeFilter()后会立即调用此方法。它允许你在beforeFilter设置组件属性,组件可以在它的startup()方法上执行beforeFilter。
为了在你的组件里使用model,你可以创建一个新的实例,如下:
$foo =& new Foo();
你也可以在你的组件中使用其他的组件。你需要在你的组件里简单声明一下哪个组件是你想用的。在下面的实例里,它是一个Session(对话)组件。
var $components = array('Session');
Model:
一般来说,model是一个数据库的访问入口,更特殊的是,它是某个特定数据库表会的访问入口。缺省的,每个model使用数据表,此表的表名是它自己的复数形式,例如,‘User‘model使用’users‘表。Model也可以包含数据验证规则,关联信息,以及指定到它使用的表的方法。
User model实例,保存在app/models/user.php
获取数据:
findAll(string $conditions,array $fields,string $order,int $limit,int $page,int $recursive); $conditions 查询条件的意识
find(string $conditions,array $fields,string $order,int $recursive)
findAllBy( string value); 查询特定的字段
field(string $name,string $conditions,string $order)返回一个字符串,即匹配$conditions 条件以及$order顺序的第一个记录的单个字段。
findCount(string $conditions)返回与给定条件匹配的记录数
query(string $query)
execute(string $query)
可以使用model的query()和execute()来执行自定义的SQL调用。两者之间的区别是query()用来执行自定义的SQL查询(返回结果),而execute()用来执行自定义的SQL命令
复杂的查找条件(使用Array)
$conditions = array("Post.title" => "This is a post");
$this->Post->find($conditions);
array("Post.title" => "<> This is a post")就在表达式前增加一个'<>‘。Cake可以解析任何有效的SQL比较操作符,包括匹配表达式,如LIKE,BETWEEN,或REGEX,只要你在表达式或值等操作符之间留一个空格。
IN(…)样式的匹配。查找title为给定值的post可以是:
array("Post.title" => array("First post", "Second post", "Third post"))
在条件中,同样简单增加额外的条件和增加额外的键/值对到数组中:
array
(
"Post.title" => array("First post", "Second post", "Third post"),
"Post.created" => "> " . date('Y-m-d', strtotime("-2 weeks"))
)
array
("Author.name" => "Bob", "or" => array
(
"Post.title" => "LIKE %magic%",
"Post.created" => "> " . date('Y-m-d', strtotime("-2 weeks")
)
)
保存你的数据 save()
删除数据 del(string $id,boolean $cascade);
视图:
一个View就是一个页面模版,通常是在一个动作之后命名。例如,PostsController::add()的视图是/app/views/posts/add.thtml
布局(Layout)
布局文件放在/app/views/layouts. Cake缺省的布局可以由一个新的缺省的布局重写。这个布局在/app/views/layouts/default.thtml.一旦创建一个新的缺省布局,当render页面时,controller view代码就会放在缺省的布局里。
当创建一个布局时,你需要告诉Cake将你的controller view代码放在哪里:为了实现此,确保你的布局为$content_for_layout包含一个位置(可选的,, $title_for_layout)。下面这个例子介绍了缺省的布局是个什么样子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php echo $title_for_layout?></title> $变量_for_layout
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
</head>
<body>
<!-- If you'd like some sort of menu to show up on all of your views, include it here -->
<div id="header">
<div id="menu">...</div>
</div>
<!-- Here's where I want my views to be displayed -->
<?php echo $content_for_layout ?>
<!-- Add a footer to each displayed page -->
<div id="footer">...</div>
</body>
</html>
为了设置布局的标题(title),在controller中最简单的方法是使用$pageTitle controller变量。
help 帮助函数
创建自己的Helper:
你需要在/app/views/helpers创建一个新类。让我们称我们的helper为LinkHelper吧。实际的PHP类文件如下:
/app/views/helpers/link.php
class LinkHelper extends Helper
{
function makeEdit($title, $url)
{
// Logic to create specially formatted link goes here...
}
}
可能需要利用在Cake Helper类里包含的一些函数:
output
string $string
boolean $return = false
决定是否输出或返回一个基于AUTO_OUTPUT(参看/app/config/core.php)和$return值的字符串。你应该使用此方法将所有数据返回到view里。
loadConfig
返回应用程序当前核心的配置以及标签定义。
使用output()格式化我们链接标题以及URL,并将它返回给view。
/app/views/helpers/link.php (增加了逻辑)
class LinkHelper extends Helper
{
function makeEdit($title, $url)
{
// Use the helper's output function to hand formatted
// data back to the view:
return $this->output("<div class=\\"editOuter\\"><a href=\\"$url\\" class=\\"edit\\">$title</a></div>");
}
}
使用自定义的Helper
一旦你已经创建了一个helper,而且将它放入/app/views/helpers/,你需要通过特殊的$helper变量将它包含在你的controller里,
class ThingsController
{
var $helpers = array('Html', 'Link');
}
;
http://cnblog.ecsquid.com/?p=602