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 Home\Controller;
拓展:
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 Think\Controller;
③声明控制器(类)并继承父类
//声明控制器(类)并继承父类 class IndexController extends Controller { public function index(){ } }
案例参考上述代码,完善User控制器
<?php //定义命名空间namespace namespace Home\Controller; //引入父类控制器 use Think\Controller; //定义控制器,继承父类 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 Admin\controller; use Think\Controller; 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 Admin\controller; use Think\Controller; 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 Admin\controller; use Think\Controller; 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 Admin\Controller; //引入父类控制器 use Think\Controller; //声明并继承父类控制器 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
输出管理员控制器,即验证成功