ThinkPHP 学习笔记 ( 二 ) 控制器 ( Controller )
/**
* ThinkPHP version 3.1.3
* 部署方式:应用部署
* 文内的 http://localhost/ 由实际主机地址代替
*/
入口文件 index.php:
<?php
define('THINK_PATH','./ThinkPHP/');
//定义项目名称和路径
define('APP_NAME','Myapp');
define('APP_PATH','./home/');
define('APP_DEBUG',true);
//加载框架入口文件
require(THINK_PATH."ThinkPHP.php");
index.php
配置信息 config.inc.php:
<?php
return array(
'URL_CASE_INSENSITIVE'=>true,
'DB_TYPE'=>'mysql',
'DB_HOST'=>'localhost',
'DB_NAME'=>'tp',
'DB_USER'=>'root',
'DB_PWD'=>'',
'DB_PREFIX'=>'tpk',
'TMPL_L_DELIM'=>'<{',
'TMPL_R_DELIM'=>'}>',
);
访问入口文件 index.php ( http://localhost/index.php ) 后自动生成 ./home 目录。

index 初始页面的内容由 ./home/Lib/Action/IndexAction.class.php 文件显示:
<?php
// 本类由系统自动生成,仅供测试用途
class IndexAction extends Action {
public function index(){
$this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p>欢迎使用 <b>ThinkPHP</b>!</p></div><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script>','utf-8');
}
}
IndexAction.class.php
( 一 ) 控制器的调用
现在修改 IndexAction.class.php,使用 A 函数调用本项目控制器:
<?php
class IndexAction extends Action {
public function test(){
$obj = A("Member");
$obj->user();
}
}
A 函数相当于 new,A("Member") 表示实例化本项目中的 Member 控制器,然后再调用 Member 控制器中的 user 方法。user 方法 ( MemberAction.class.php ):
<?php
class MemberAction extends Action{
public function user(){
$this->assign("user","dee0912");
$this->display();
}
}
因为在 Index 控制器 中的 test 动作调用了 Member 控制器的 user 方法 ( 因为此处的 user 动作已被实例化,因此此处不能成为动作,而是作为类的方法 ) 的 $this->display(),所以需要在当前动作 ( test 动作 ) 中输出模板 ( ./home/Tpl/Index/test.html ) :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>
欢迎使用 ThinkPHP.<br>
您的用户名是<{$user}>
</body>
</html>
test.html
通过 PATHINFO 模式的 url ( http://localhost/index.php/index/test ,我的主机地址是127.0.0.26 ) 可以访问 Index 控制器的 test 动作

可以使用 R 函数来代替 A 函数,R 函数可以在调用控制时指定调用方法 ( 动作 ),修改 IndexAction.class.php:
<?php
class IndexAction extends Action {
public function test(){
$obj = R("Member/user"); //使用 R 函数调用本项目的控制器
}
}
可以达到同样的效果。
( 二 ) 空控制器与空动作
空控制器和空动作可以实现错误 404 的功能 ( 但是不能取代服务器错误页面处理机制,空控制器和空动作只能处理 MVC 框架内的页面,而且也不能处理 URL REWRITE 自定义格式的页面 )。
1、空控制器
当用户访问的 URL 不存在需要访问的控制器时,可以使用空控制器,例如访问 http://localhost/index.php/bbs,实际上不存在控制器 BbsAction,系统会给出错误 ( 需要在入口文件 index.php 开启 define('APP_DEBUG',true); ):

现在在项目目录 ( ./home/Lib/Action ) 下创建控制器类文件 EmptyAction.class.php :
<?php
class EmptyAction extends Action{
public function index(){
$this->assign("msg","你所查看的栏目已经不存在");
$this->display("./Public/html/error.html");
}
}
同时在 WEB 根目录的 Public/html 下创建error.html,这样访问 http://localhost/index.php/bbs 出现的就是自定义的信息内容。
视图文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body><{$msg}></body>
</html>
error.html
页面显示:

2、空动作
相较空控制器定位到栏目,空动作则是定位到具体的页面。如果 Index 控制器中不存在 user 动作,只需要在 Index 控制器中加入空动作,系统会把 _empty 动作代替 user 动作:
<?php
class IndexAction extends Action {
public function test(){
$obj = R("Member/user");
}
public function _empty(){
$this->assign("msg","你所查看的页面不存在");
$this->display("./Public/html/error.html");
}
}
页面显示:

参考资料:《PHP MVC 开发实战》
ThinkPHP 学习笔记 ( 二 ) 控制器 ( Controller )的更多相关文章
- ThinkPHP学习笔记(二)
1.比较好的参考手册(非官方,注意:也有一些错误,当出不来想要的效果时以官方的手册为准):http://www.5idev.com/p-thinkphp_lib_vendor.shtml 2.加载自定 ...
- thinkphp学习笔记4—眼花缭乱的配置
原文:thinkphp学习笔记4-眼花缭乱的配置 1.配置类别 ThinkPHP提供了灵活的全局配置功能,ThinkPHP会依次加载管理配置>项目配置>调试配置>分组配置>扩展 ...
- thinkphp学习笔记7—多层MVC
原文:thinkphp学习笔记7-多层MVC ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层 ...
- thinkphp学习笔记5—模块化设计
原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- thinkphp学习笔记6—url模式
原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...
- AngularJs学习笔记--Understanding the Controller Component
原版地址:http://docs.angularjs.org/guide/dev_guide.mvc.understanding_model 在angular中,controller是一个javasc ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
随机推荐
- 桶排序(bucket sort)
Bucket Sort is a sorting method that subdivides the given data into various buckets depending on cer ...
- 希尔排序( Shell Sort)
原文地址:http://www.stoimen.com/blog/,在此感谢作者! Insertion sort is a great algorithm, because it’s very int ...
- JavaScript开发中的一些问题
1.求y和z的值是多少? <script type=”text/javascript”> var x = 1; var y = 0; var z = 0; function add(n){ ...
- 罗辑思维CEO李天田:我们是这样玩儿公司的
脱不花,原名李天田,罗辑思维联合创始人. 移动互联网.90后.创业潮,正在成为所有公司管理的共同挑战.怎么在公司里营造竞赛式的创业气氛?如何用游戏化管理来激活90后的工作热情?移动互联网的即时化.碎片 ...
- jQuery 知识点积累
1.判断checkbox是否选中 $("#aa").prop("checked")==true2.给属性赋值 $("#aa").pr ...
- AppInventor学习笔记(四)——打地鼠应用学习
一.组件设计 1.整体预览 2.图片精灵的添加 (1)首先加入一个画布进去 调节属性如图 (2)添加精灵 添加精灵,然后上传张图片进行属性修改 3.加入Clock 直接加入,设定为1000ms 二.B ...
- eclipse中编译时enum出现cannot be resolved to a type错误
eclipse中编译时enum出现cannot be resolved to a type错误 通常是因为eclise使用的jdk版本的问题...默认是使用的是jdk1.5 应该去选择成jdk1.6或 ...
- python 添加类属性
类属性必须赋值. 创建类属性 类是模板,而实例则是根据类创建的对象. 绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有 ...
- javascript优化--10模式(设计模式)01
单体模式:保证一个特定类仅有一个实例;即第二次使用同一个类创建新对象时,应该得到与第一个所创建对象完全相同对象: 在JS中,可以认为每次在使用对象字面量创建对象的时候,实际上就在创建一个单体: 当使用 ...
- Google地图接口API之地图类型(六)
1. Google 地图- 基本地图类型 Google Maps API 中提供了以下地图类型: MapTypeId.ROADMAP,用于显示默认的道路地图视图 MapTypeId.SATELLITE ...