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
输出管理员控制器,即验证成功
ThinkPHP---thinkphp控制器、路由、分组设置(C)的更多相关文章
- 2016/5/6 thinkphp ①框架 ② 框架项目部署 ③MVC模式 ④控制器访问及路由解析 ⑤开发和生产模式 ⑥控制器和对应方法创建 ⑦视图模板文件创建 ⑧url地址大小写设置 ⑨空操作空控制器 ⑩项目分组
真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格不一样) 项目稳 ...
- thinkphp最简单路由
thinkphp最简单路由 一.总结 1.路由应用场景(前台要,后台不要):前台所有人都可以看,所以前台的话设置路由,后台的话并不是所有人都进去,所以不需要设置路由 2.模块分离来实现路由场景应用:前 ...
- thinkphp动态注册路由
thinkphp动态注册路由 一.总结 1.thinkphp使用路由步骤:a.config配置文件中开启路由 b.Route类的rule方法创建路由(在Routephp中)Route::rule(' ...
- 自学PHP的第22天---ThinkPHP中的路由、ThinkPHP目录结构
这一切的一切都得从“Hello world”说起!!! 有很多东西在thinkPHP的官方开发文档上其实都有讲到,我在这里只是想记录自己每天坚持学习PHP的情况,今天接触ThinkPHP的路由,路由这 ...
- THINKPHP之控制器
如何新增控制器? 在Lib/Action中新增一个控制器:ProductAction.class.php: <?php class ProductAction extends Action{ ...
- Thinkphp的自定义路由(route.php)
废话:因为thinkphp的默认路由会导致URL特别长,从而会影响搜索引擎优化.所以就衍生了自定义路由,尽量将URL缩短. 这是默认的路由文件: <?php return [ '__patter ...
- ThinkPHP新建控制器
ThinkPHP新建控制器 一.效果图 二.步骤 1.新建控制器文件 2.编写控制器文件 3.访问控制器 三.注意事项
- 修改route.php文件对ThinkPHP快速注册路由
THINKPHP快速注册路由方式可以用 return[ "test"=>"index/index/demo", 'getid/:id'=>'inde ...
- laravel的路由分组,中间件,命名空间,子域名,路由前缀
laravel的路由分组,就是把一些具有相同特征的路由进行分组,比如一些路由需要进行验证,一些路由有共同的前缀,一些路由有相同的控制器命名空间等. 这样把路由组合在一起,方便管理,维护性更好. Rou ...
随机推荐
- hdu 1258 Sum It Up (dfs+路径记录)
pid=1258">Sum It Up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- Android ListView的item点击无响应的解决方法
假设listitem里面包含button或者checkbox等控件,默认情况下listitem会失去焦点,导致无法响应item的事件,最经常使用的解决的方法 是在listitem的布局文件里设置des ...
- Semaphore and SemaphoreSlim
https://msdn.microsoft.com/en-us/library/z6zx288a(v=vs.110).aspx The System.Threading.Semaphore clas ...
- HDU5834Magic boy Bi Luo with his excited tree 树形dp
分析:典型的两遍dfs树形dp,先统计到子树的,再统计从祖先来的,dp[i][0]代表从从子树回来的最大值,dp[i][1]代表不回来,id[i]记录从i开始到哪不回来 吐槽:赛场上想到了状态,但是不 ...
- Spark 二项逻辑回归__二分类
package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{B ...
- Android 在eclipse中没有出现AVD的解决方法(转载)
转自:http://frabbit2013.blog.51cto.com/1067958/1243549 本文主要介绍在系统中成功配置好Android开发环境(即SDK is ok and ADT o ...
- 17年day4
/* 嗯,又一天 上午考试,睡了两觉(我不会把我第二觉流了口水这件事说出去) 状态比较玄学,上午困得要死,下午无比精神(感觉NOIP要完). 复习了概率期望.发现以前做过的题还是不会做,好像连印象都比 ...
- bzoj4534: 基础排序算法练习题
传送门 策爷的论文题啊……题解在这儿 我只想知道为什么这题的弱化版会出现在我们今天的%你赛里…… 题意:给你一堆操作$(l,r)$,表示将区间$(l,r)$按升序排序.以及$q$个询问,每次询 ...
- phpAnalysis调试接口
phpAnalysis是一款轻量级非侵入式PHP应用性能分析器,适用于开发.测试及生产环境部署使用,方便开发及测试工程师诊断性能问题: 通过tideways收集PHP程序单步运行过程中所有的函数调用时 ...
- [Qt Creator 快速入门] 第9章 国际化、帮助系统和Qt插件
一.国际化 国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),一个应用程序的国际化就是使该应用程序可以让其他国家的用户使用的过程. Qt支持现在 ...