/**
* 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 )的更多相关文章

  1. ThinkPHP学习笔记(二)

    1.比较好的参考手册(非官方,注意:也有一些错误,当出不来想要的效果时以官方的手册为准):http://www.5idev.com/p-thinkphp_lib_vendor.shtml 2.加载自定 ...

  2. thinkphp学习笔记4—眼花缭乱的配置

    原文:thinkphp学习笔记4-眼花缭乱的配置 1.配置类别 ThinkPHP提供了灵活的全局配置功能,ThinkPHP会依次加载管理配置>项目配置>调试配置>分组配置>扩展 ...

  3. thinkphp学习笔记7—多层MVC

    原文:thinkphp学习笔记7-多层MVC ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层 ...

  4. thinkphp学习笔记5—模块化设计

    原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...

  5. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  6. thinkphp学习笔记6—url模式

    原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...

  7. AngularJs学习笔记--Understanding the Controller Component

    原版地址:http://docs.angularjs.org/guide/dev_guide.mvc.understanding_model 在angular中,controller是一个javasc ...

  8. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  9. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

随机推荐

  1. linux环境下配置虚拟主机域名

    linux环境下面配置虚拟主机域名 第一步:在root目录下面(即根目录)ls(查看文件)cd进入etc目录find hosts文件vi hosts 打开hosts文件并进行编辑在打开的文件最下面添加 ...

  2. iptables 无法连外网

    [root@v01-svn-test-server ~]# service iptables status Table: filter Chain INPUT (policy DROP) num ta ...

  3. transient关键字使用笔记

    >>transient的作用及使用方法 一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...

  4. Java Hour 18 来个CURD吧 (三)

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为18 Hour,请各位不吝赐教. 依赖Jar 包管 ...

  5. [译] 在Web Forms 中使用ASP.NET Routing

    本文将以最少的代码想你展示一下的效果: 自定义RUL而不依赖于物理文件名. 使用标记或者代码产生基于route 参数的URL . 如何获得标记或者代码路由过来的参数. 创建Routes void Ap ...

  6. wp7 BaseDictionary<TKey, TValue>

    /// <summary>/// Represents a dictionary mapping keys to values./// </summary>/// /// &l ...

  7. Lua Require函数

    转自:http://www.cppblog.com/cslover/archive/2013/12/21/204934.html Lua提供高级的require函数来加载运行库.粗略的说require ...

  8. C++的那些事:函数全解析

    一.函数的结构 函数在C++中可能出现在三种地方,一是函数的定义,它包括了如上图的结构:二是函数的声明,它与函数的定义相比,没有了函数体部分:三则是函数的调用.当然,不同的函数定义可以还会稍有不同,比 ...

  9. Div 添加阴影

    <style type="text/css">.mydiv{   width:250px;height:auto;border:#909090 1px solid;ba ...

  10. WPF MVVM模式下的无阻塞刷新探讨

    很多时候我们需要做一个工作,在一个方法体里面,读取大数据绑定到UI界面,由于长时间的读取,读取独占了线程域,导致界面一直处于假死状态.例如,当应用程序开始读取Web资源时,读取的时效是由网络链路的速度 ...