cakePHP 入门与应用
东方文林
2023-12-01
1.下载:http://cakephp.org/ 下载最新的稳定版本
2.解压:
认识目录结构:
index.php
app ---你放置应用程序的地方
lib ---框架核心部件,请不要修改这个资料夹里的所有档案
plugins ---可以放置你要在应用程序中使用的第三方插件
vendors ---可以放置你要在应用程序中使用的第三方PHP程序库
3.认识项目目录结构 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
4.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
名词理解: element html页面元素(在cakephp中element是指页面上的板块(类使用smarty中的include 加载文件))
cakephp 规则:
命名规范
CakePHP的命名规则从许多开发者多年的经验及一些惯例筛选出来。
controller 规则
控制器名+Controller
控制器名首字母大写,驼峰命名法
PeopleController
控制器需要继承 AppController
控制器文件名规则:
控制器名Controller.php
控制器的类别名称可以是复数,比如 usersController.php
关于访问:
你给控制器Controller写的第一个方法应该是index()。当一个请求指定一个控制器Controller但没有指定方法时,
CakePHP会默认执行那个控制器Controller的index()方法。
action的能见度:
你也可以给控制器的方法名前加下划线来改变控制器能见度。如果一控制器的方法名前已加上下划线,这个方法就不能直接通过 web来访问但是可以通过内部调用。
例如:
<?php
class NewsController extends AppController {
public function latest() { //该方法可以通过url 访问
$this->_findNewArticles();
}
protected function _findNewArticles() { //该方法只能通过内部访问,不能通过url访问
echo '我是内部访问的方法';
}
}
文件及类名称命名规范:
控制器类KissesAndHugsController会被命名为 KissesAndHugsController.php
组件类MyHandyComponent会被命名为 MyHandyComponent.php
模型类OptionValue会被命名为 OptionValue.php 直接命名要加Model 否则自动验证就会失效哦
行为类EspeciallyFunkableBehavior会被命名为 EspeciallyFunkableBehavior.php
视图类SuperSimpleView会被命名为 SuperSimpleView.php
助手类BestEverHelper会被命名为 BestEverHelper.php
模型及数据库命名规范:
模型类别名称是单数且使用骆驼命名法。Person、BigPerson和ReallyBigPerson都是模型命名规范的例子。
数据库中的表命名和模型命名基本一致,如果是复数用底线分割单词,数据表名称Persons、big_people和 really_big_people,会各自与上述的模型对应
你的数据库中的表也应该遵循下面的命名规则:
cake使用的表名(Table name)应该有英文的复数形式组成,比如users, authors, articles. 注意,对应的model是单数形式
所有的表 都必须有一个主键叫做 id
了解控制器中的几个重要的类:
1.CakeRequest对象主要负责以下几个功能:
处理GET,POST,FILES数组,并以对象形式返回这些数据
提供发起请求的客户端相关信息,如headers,客户端IP地址,域名信息
提供获取请求参数的方法,包括数组及对象属性。
CakeRequest提供了多个接口用于获取请求参数
获取路径信息
$this->request->webroot 包含了当前根目录的路径
$this->request->base 相当于PHP函数中获取的base path
$this->request->here 获取当前请求的完整路径
$this->request->query 包含了查询字符串参数
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']
获取查询字符串(QueryString)参数 http://127.0.0.1/cakephp/home/page/?page=12
$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');
与视图交互
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'));
}
}
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
var $components = array('acl');
组件(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。
$this->data 与 $this->params
在视图中
$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
)
---------------
查看源码:
创建你的应用目录
在index.php中
define('APP_DIR', 'app'); 你的应用目录
define('WEBROOT_DIR', 'webroot'); 你的渲染主题
下面是index.php --一般不需要修改
define('APP_DIR', 'app');
define('DS', DIRECTORY_SEPARATOR);
define('ROOT', dirname(__FILE__));
define('WEBROOT_DIR', 'webroot');
define('WWW_ROOT', ROOT . DS . APP_DIR . DS . WEBROOT_DIR . DS);
if (!defined('CAKE_CORE_INCLUDE_PATH')) {
define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'lib');
}
require APP_DIR . DS . WEBROOT_DIR . DS . 'index.php';
模板后缀名:
cakephp 默认采用的ctp后缀名 如果你需要修改
lib/Cake/Controller/Controller.php/
public $ext = '.ctp'; 通常我们可以手动改,在你的当前类声明属性覆盖$ext
--------------
安装:
安装之前的准备: 打开apache 重写
配置数据库:
D:\www\cakephpDemo\app\Config\database.default.php 改成 database.php
public $default = array(
'datasource' => 'Database/Mysql', #数据库引擎
'persistent' => false, #是否长连接
'host' => 'localhost', #mysql的服务器地址
'login' => 'root', #mysql登陆的用户
'password' => 'root', #mysql的密码
'database' => 'bolg', #数据库名称
'prefix' => '', #表前缀
'encoding' => 'utf8', #mysql默认编码
);
修改配置文件:
app/config/core.php
Configure::write('Security.salt', 'mytest'); 修改你的项目秘钥值
Configure::write('Security.cipherSeed', '123');
修改你的路由: cakephp 的普遍规则: 一个控制器 服务于一个模型
app/Config/router.php
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::connect('/你的路由', array('controller' => '你的控制器', 'action' => '你的action', '你的的视图名称'));
注意: 按照cakephp 的规则 你的表名必须是一个复数 xxxs
按照cakephp 的规则 你的每个表必须有一个主键
App::uses('AppController', 'Controller');
class UsersController extends AppController {
//put your code here
public function index(){
$this->render('welcome');
}
}
render() 的规则 如果你的页面名同action名称相同那么就不需要写render cakephp 在执行完控制器自动渲染你的视图
如果你需要掉当前控制器下其他页面是就需要render('pagename')
控制器中的常用属性变量:
public $uses = array(); 在控制器中加载你的模型名称
public $helpers = array(); 在控制器中设置你的帮助助手
public $layout = 'default'; 在控制器中更改你的默认布局
public $components = array('Session'); 在控制器中申明你的组件---
public $ext = '.ctp'; 在控制器可以修改你的view名称
public $cacheAction = array(
'view/23/' => 21600,
'recalled/' => 86400
); 在控制器中设置你缓存页面以及时间
------------
如何修改布局:
在你的控制中声明属性
public $layout='main'; #该布局默认将指向views/layouts/main.ctp
下面是我们创建自己的默认布局文件
<!DOCTYPE html>
<html>
<head>
<title><?php echo $title_for_layout ;?></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
</head>
<body>
<div class="wrap_box">
<?php echo $this->element('header'); ?>
<div class="content">
<?php echo $content_for_layout; ?>
</div>
<?php echo $this->element('footer'); ?>
</div>
</body>
</html>
代码解释:
在cakephp中layout里常用$title_for_layout,$content_for_layout动态显示内容和标题。可以在Controller中设置$layout和$pageTitle属性。
$this->element('footer'); 表示加载文件 元素文件默认是放在 views/elements/下面的
$this->set('title_for_layout', 'This is the page title');
引用你的css js image 文件
这些文件默认放在 webroot/css js img
在你的模版中调用css js img
<?php echo $this->Html->css('main'); ?> 等价于 <link rel="stylesheet" type="text/css" href="/cakephp/css/main.css" />
<?php echo $this->Html->script('main'); ?> 等价于 <script type="text/javascript" src="/cakephp/js/main.js"></script>
注意关键词的避免,在你的文件名中最好不要包含 style script 关键词
加载多个css js 将参数作为数组
<?php echo $this->Html->css(array('test','cake.main'));?>
生成a标签链接
<?php echo $this->Html->link('注册','/Users/registry',array('class'=>'navLink','target'=>'_blank'))?>
<?php echo $this->Html->link('文本','路由',array(a标签的html属性参数))?>
生成链接地址
<a href="<?php echo $this->Html->url('/Users/index')?>">首页</a>
Htmlhelp:
$this->Html->charset("utf-8 "); 设置网页编码
$this->Html->meta('keywords','你的网页关键词在这里');
$this->Html->meta('description','你的网页介绍在这里');
$this->Html->image('cake_logo.png', array('alt' => 'CakePHP')); 等价 <img src="/img/cake_logo.png" alt="CakePHP" />
$this->Html->image("recipes/6.jpg", array("alt" => "Brownies",'url' => array('controller' => 'recipes', 'action' => 'view', 6)));
注意: 'url' => array('controller' => 'recipes', 'action' => 'view', 6) 是配置a标签的链接
等价于
<a href="/recipes/view/6">
<img src="/img/recipes/6.jpg" alt="Brownies" />
</a>
给a标签添加事件
$this->Html->link(
'文本',
array('controller' => 'recipes', 'action' => '事件名称', 6),
array(),
"事件触发时的提示"
);
创建html标签
$this->Html->tag('span', 'Hello World', array('class' => 'welcome')); <span class="welcome">Hello World</span>
创建table中th
$this->Html->tableHeaders(array('Date', 'Title', 'Active'));
创建table中的td
echo $this->Html->tableCells(array(
array('Jul 7th, 2007', 'Best Brownies', 'Yes'),
array('Jun 21st, 2007', 'Smart Cookies', 'Yes'),
array('Aug 1st, 2006', 'Anti-Java Cake', 'No'),
));
FormHelp 表单帮助:
创建当前路由的表单提交
<?php echo $this->Form->create();?>
创建将数据提交到当前控制器的另外一个action中
<?php echo $this->Form->create('Users', array('action' => 'login')); ?>
创建将数据提交到其他控制器中的action 中的form
echo $this->Form->create(null, array('url' => array('controller' => 'Message', 'action' => 'add')));
创建远程数据提交表单
echo $this->Form->create(null, array('url' => 'http://www.google.com/search','type' => 'get'));
创建input
<?php echo $this->Form->input('userpwd',array('type'=>'password','label'=>"密码"));?>
创建lable
echo $this->Form->label('User.name', 'Your username');
help 帮助函数
创建自己的Helper:
你需要在/app/views/helpers创建一个新类。让我们称我们的helper为LinkHelper吧。实际的PHP类文件如下:
/app/views/helpers/link.php
class LinkHelper extends Helper{
function makeEdit($title, $url){
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');
}
-------------------------------------------------
扩展功能库:
强制加载: APP::load();
软加载: APP::use();
在cakephp 中使用插件
如何实现模型的应用
如何快速的实现curd