ThinkPHP---thinkphp控制器、路由、分组设置(C)

配置文件分3类:系统配置文件,分组配置文件,应用配置文件

①系统配置文件ThinkPHP/Conf/convention.php;

②分组 / 模块 /平台配置文件Home/Conf/config.php;

③应用配置文件Common/Conf/config.php;

【一】控制器

(1)控制器的创建

作用:负责用户输入及命令的调用

①命名规范:控制器名(Index,英文,首字母大写)+controller关键词+class.php

例如:创建商品控制器GoodsControllerclass.php,用户控制器UserControllerclass.php

案例:在Home分组中创建一个用户控制器User控制器

(2)控制器结构代码

①声明当前控制器(类)命令空间

//命名空间
namespace HomeController;

拓展

           1. 命名空间最早出现在PHP5.3.0版本。所以即使使用PHP3.2.3版本,在入口文件也要求你的版本环境大于5.3.0

// 应用入口文件
// 检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<'))  die('require PHP > 5.3.0 !');

         2. 命名空间本身跟目录没有关系,但声明和使用则必须和目录挂钩,这是thinkphp要求。即去哪里找对应目录

②引入父类控制器(类)

//引入父类控制器
use ThinkController;

③声明控制器(类)并继承父类

//声明控制器(类)并继承父类
class IndexController extends Controller {
    public function index(){
        
    }
}

 案例参考上述代码,完善User控制器

<?php
    //定义命名空间namespace
    namespace HomeController;
    //引入父类控制器
    use ThinkController;
    //定义控制器,继承父类
    class UserController extends Controller{
        
    } 
?>

接下来在类里,编写测试方法test:

//定义测试方法,public修饰词(private,protected,static,public)
//修饰词(1)public公共的可以内外调用;(2)private私有的只能内部调用;(3)protected有继承关系的调用;(4)static静态的
public function test(){
      phpinfo();
}

然后调用控制器显示结果:localhost/?m=Home&c=User&a=test

如果后期需要更多的控制器来实现功能,则只需要按照上述创建步骤反复创建更多需要控制器即可①命名规范;②控制器的继承和声明;③方法

(3)控制器中的跳转

①url组装(ThinkPHP里俗称U方法),对于配置文件里路由形式的配置值,不影响地址栏中输入其他形式路由访问。该配置项的值,影响的是ThinkPHP系统封装的URL组装函

数(U函数)生成url地址的形式

验证:将配置文件convention.php中URL_MODEL改为0,在控制其中用U方法输出当前控制器下方法路径,结果为

/index.php?m=Admin&c=index&a=index&name=tony&age=23

而正常默认pathinfo形式下的输出为

/index.php/Admin/index/index/name/tony/age/23.html

②Tp中的跳转

 详解:

 1. url组装

就是根据某种规则组成一个url地址,这个功能就叫组装。

在ThinkPHP里,系统提供了一个封装的函数来处理url的组装,俗称U方法。

U方法是系统提供的快速方法,除此外还有A,B,C,D,E,F,G,IM,R,S,U等快速方法。这些方法都定义在系统的函数库文件(ThinkPHP/Common/functions.php)里

/**
 * URL组装 支持不同URL模式
 * @param string $url URL表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...'
 * @param string|array $vars 传入的参数,支持数组和字符串
 * @param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值
 * @param boolean $domain 是否显示域名
 * @return string
 */
function U($url='',$vars='',$suffix=true,$domain=false) {...}

U方法语法:①U('url路径',参数数组可选);②指定控制器下的指定方法,例U('Index/index')

例如:使用U方法组装出当前控制器下index方法的地址,U('index')

Test控制器:

<?php
    namespace Admincontroller;
    use ThinkController;
    class TestController extends Controller{
        public function test(){
            echo U('index');//输出/index.php/Admin/Test/index.html
        }
    }
?>
<meta charset="utf-8">

 加上数组参数,例echo U('index/index',array('name' => 'tony','age' => '23'));

<?php
    namespace Admincontroller;
    use ThinkController;
    class TestController extends Controller{
        public function test(){
            echo U('index/index',array('name' => 'tony','age' => '23'));//输出/index.php/Admin/index/index/name/tony/age/23.html
        }
    }
?>

 总结:

通用语法格式:U('分组名/控制器名/方法名',array('参数名1'=>参数值1,'参数名2'=>参数值2....))

 2. Tp系统中的跳转

在ThinkPHP中有两种跳转方法:成功跳转、失败跳转,在控制器中执行跳转

成功跳转:$this->success(跳转提示信息,跳转地址--可选,等待时间--可选);

                  没有指定跳转地址,则跳转到上一页

<?php
    namespace Admincontroller;
    use ThinkController;
    class TestController extends Controller{
        public function test1(){
            echo U('index/index',array('name' => 'tony','age' => '23'));
        }
        public function test2(){
            //成功跳转,地址为test1,即当前控制器下的test1方法
            $this->success('操作成功',U('test1'),5);
        }

失败跳转:$this->error();

      语法与成功跳转相同,对上述进行修改

public function test2(){
      //失败跳转,地址为test1,即当前控制器下的test1方法
      $this->error('操作失败',U('test1'),5);
}

总结:控制器的跳转成功和失败方法,继承自Think的controller.class.php控制器

/**
     * 操作错误跳转的快捷方法
     * @access protected
     * @param string $message 错误信息
     * @param string $jumpUrl 页面跳转地址
     * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
     * @return void
     */
    protected function error($message='',$jumpUrl='',$ajax=false) {
        $this->dispatchJump($message,0,$jumpUrl,$ajax);
    }

    /**
     * 操作成功跳转的快捷方法
     * @access protected
     * @param string $message 提示信息
     * @param string $jumpUrl 页面跳转地址
     * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
     * @return void
     */
    protected function success($message='',$jumpUrl='',$ajax=false) {
        $this->dispatchJump($message,1,$jumpUrl,$ajax);
    }

【二】路由

路由:访问项目中具体某个方法的URL地址,简单理解就是URL地址

在ThinkPHP里系统提供了4种路由形式(之前的路由形式:index.php?p=平台&c=控制器&a=方法;pca)

总结:pca为平台、控制器、方法;thinkPHP里mca为分组、控制器、方法

①普通形式路由;

②Pathinfo形式路由;

③Rewrite形式路由;

④兼容形式路由

下面详解

(1)普通形式路由

也叫get形式路由,所有信息通过get传递

路由形式:http://网址/入口文件(index.php)?m=分组&c=控制器名&a=方法&参数名=参数值

例如:访问Home分组下的User控制器中的test方法,并传递一个参数id=1

http://www.1336.com/index.php?m=Home&c=User&a=test&id=1

可以通过$_GET['id']来验证,输出1。所以验证成功

缺点:url传递的东西都会显示出来,既不安全也不好看。所以用的不多

(2)pathinfo()形式路由(thinkPHP的默认路由

路由形式:http://网址/入口文件(index.php)/分组名/控制器名/方法/参数名1/参数值1/参数名n/参数值n

http://www.1336.com/index.php/Home/User/test/id/100

方法里有$_GET['id'],输出100。所以验证成功

(3)rewrite路由形式(重写)

路由形式:http://网址/分组名/控制器名/方法名/参数1/参数值1/参数n/参数值n

与thinkPHP默认的路由形式Pathinfo()形式路由的不同之处就是,缺少了入口文件

注意:该路由形式不能直接使用,需要配置完成才能使用

配置步骤:

             1. 配置Apache下的httpd.conf,开启扩展rewrite重写模块;

             2. 修改虚拟主机配置文件,文件位于Apache目录下,conf/extra/httpd-vhosts,加上允许重写配置。表示允许重写当前站点

            简单说就是给需要开启重写的站点,目录配置处添加Allowoverride:all

#针对目录的详细配置
    <Directory>
        #允许所有访问
        allow from all
        #允许重写
        AllowOverride all
        #表示允许站点显示文件目录结构
        Options +indexes
    </Directory>

           3. 重启Apache

           4. 将ThinkPHP压缩包中的.htaccess文件复制到入口文件的同级目录

配置完成后输入网址验证,这里还用上面pathinfo的网址,去掉入口文件后刷新,发现输出100。OK~配置完成

拓展:

PHP的运行模式(5大运行模式):CGI模式(通用网关接口);FastCGI模式(常驻型CGI);CLI(命令行运行);Web模块模式(Apache等Web服务器运行的模式);ISAPI模式(5.3版本后不再支持)

现在用的环境集成包的模式为Web模块模式,工作开发中常用FastCGI常驻型模式

综上,rewrite模式需要Apache支持,一般不推荐使用。除了Apache外服务器软件还有nginx,lightd等。

(4)兼容路由形式

兼容路由形式结合了普通路由形式、pathinfo路由形式、rewrite路由形式特征

路由形式:http://网址/入口文件?s=/分组名/控制器名/方法名/参数1/参数值1

注意:兼容路由形式只有1个参数:参数名s,后面可以看做s参数值

例如:http://www.1336.com/index.php?s=/Home/User/test/id/100,验证输出100,说明访问成功

(5)拓展:ThinkPHP中路由形式的配置

     配置文件ThinkPHP/Conf/convention.php,ThinkPHP惯例配置文件

/* URL设置 */
'URL_CASE_INSENSITIVE'  =>  true,   // 默认false 表示URL区分大小写 true则表示不区分大小写
'URL_MODEL'             =>  1,       // URL访问模式,可选参数0、1、2、3,代表以下四种模式:
// 0 (普通模式); 1 (Pathinfo 模式); 2 (REWRITE  模式); 3 (兼容模式)  默认为Pathinfo 模式

注意:路由形式的配置值,不影响地址栏中输入其他形式路由访问。该配置项的值,影响的是ThinkPHP系统封装的URL组装函数(U函数)生成url地址的形式

【三】分组 / 平台

分组:一般项目会根据某个功能的使用对象(用户/管理员管理后台)来区分代码,放到文件夹里,该文件夹即为分组文件夹。

例如Application下Home给前台看,Admin给后台管理员看

分组就是通常所指的平台,前台和后台。

刚部署好的ThinkPHP系统中Home目录为分组目录(前台目录),后期如果需要更多的分组,需要自己去创建

(1)如何创建分组?

参考Home分组的目录结构即可,

①设置与Home同级文件;

②参考Home创建目录结构

(2)访问?

分组创建好后,可以在Admin分组里编写一个控制器,然后编写方法进行测试

①创建控制器:控制器名(Index,英文,首字母大写)+controller关键词+class.php

②编写控制器:

<?php
    //定义命名空间namespace
    namespace AdminController;
    //引入父类控制器
    use ThinkController;
    //声明并继承父类控制器
    class AdminController extends Controller{
        echo "管理员控制器";
    } 
?>

③测试访问:

普通形式路由:http://www.1336.com/index.php?m=Admin&c=Test&a=test

默认形式pathinfo路由:http://www.1336.com/index.php/Admin/Test/test

输出管理员控制器,即验证成功

原文地址:https://www.cnblogs.com/fightjianxian/p/8637061.html