隐藏index.php
-
打开apache重写模块
-
配置虚拟主机中允许重写
-
在入口文件中要有.htaccess文件
重启apache服务,让配置生效。访问时就可以不用带index.php文件了
路由
定义路由
路由文件的位置:项目目录/routes/route.php文件中进行如下格式的定义
Route::请求方式('路由表达式',匿名函数);
Route::请求方式('路由表达式','[@]模块名/控制器名/方法名');
=注:给控制器方法设置好了请求的路由规则后,原来的pathinfo请求则失效,请求就会报异常,只能通过自定义路由规则来请求=
路由配置
如果设置路由相关配置文件则必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常
- 配置强制路由,在config/app.php配置文件中设置
'url_route_must' => true,
注:将开启强制使用路由,这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常
- 路由缓存
对于路由规则较多的应用可以大幅提升路由性能(仅部署模式有效)
'route_check_cache' => true,
注:如果路由定义中,有某个路由规则的路由地址使用了闭包的方式,那么路由缓存将会失效。
- 完全匹配
'route_complete_match' => true,
路由请求类型
Route::get(); // 定义GET请求路由规则 查询
Route::post(); // 定义POST请求路由规则 添加
Route::put(); // 定义PUT请求路由规则 修改
Route::delete(); // 定义DELETE请求路由规则 删除
Route::any(); // 所有请求都支持的路由规则 框架提供 不推荐
代码示例
<?php
use think\facade\Route;
Route::get('/', function(){
return "我是get请求";
}); // 定义GET请求路由规则 查询
Route::post('/',function(){
return "我是post请求";
}); // 定义POST请求路由规则 添加
Route::put('/',function(){
return "我是put请求";
}); // 定义PUT请求路由规则 修改
Route::delete('/',function(){
return "我是delete请求";
}); // 定义DELETE请求路由规则 删除
Route::any('/',function(){
return "我是any请求";
}); // 所有请求都支持的路由规则 框架提供 不推荐
postman测试请求
路由参数
定义格式
# 必填参数
Route::请求方式('路由表达式/:参数',匿名函数);
# 可选参数
Route::请求方式('路由表达式/[:参数]',匿名函数);
代码示例
use think\facade\Route;
/*
Route::get("test/:id",function($id){
return "我的参数是:".$id;
});
//php7版本以上才有的标量限定(类型匹配),据说效率提高4倍
Route::get("test/:id",function(int $id){
return "我的参数是:".$id;
});
//参数限制
Route::get("test/:id",function($id){
return "我的参数是:".$id;
})->pattern(['id'=>'\d+']);
*/
//可选参数定义格式
Route::get("test/[:id]",function($id=10){
return "我的参数是:".$id;
});
路由分组
路由分组功能允许把相同前缀的路由定义合并分组,这样可以简化路由定义,并且提高路由匹配的效率
路由分组定义格式
Route::group('分组名(字符串)或者分组路由参数(数组)','分组路由规则(数组或者闭包)');
<?php
use think\facade\Route;
// Route::group('admin',function(){
// Route::get('login', function(){
// return "登录";
// });
// Route::get('logout', function(){
// return "退出";
// });
// })->pattern(['id' => '\d+']);
//路由嵌套
Route::group(['method' => 'get'], function () {
Route::group('admin',function(){
Route::get('login', function(){
return "登录";
});
Route::get(':id', function($id){
return "退出".$id;
});
});
})->pattern(['id' => '\d+']);
控制器
控制器的后缀
打开配置文件config/app.php,有如下配置
'controller_suffix' => false,
# 表示默认情况下,控制器无特殊后缀。例如 Index控制器,文件名为Index.php
如果需要进行设置,可以设置为
'controller_suffix' => 'Controller',
# 表示控制器以Controller为后缀。例如Index控制器,文件名为IndexController.php
=一般不建议进行修改,保持默认,框架默认给我们的配置=
使用命令行创建分组
命令格式如下
php think build --module 分组名称
创建控制器
创建控制器两种方式
- 手动创建
application/模块目录/controller/控制器类文件
命名规则:控制器名称(首字母大写) + (控制器后缀,默认没有) + .php
- 命令行方式创建
php think make:controller --plain 模块名/控制器名
# 参数说明
--plain 标准控制器 (没有加此参数默认创建的控制器是一个资源控制器,所以一般加上此选项)
不加–plain
加上–plain
如果创建时,没有在模块名称,则默认创建到公共模块中 【common】
开启调试模式
-
默认情况下,错误描述比较模糊,不方便进行错误调试。这种模式通常叫做“部署模式”。
开发阶段可以将框架设置为调试模式,便于进行错误调试:
修改项目目录 config/app.php文件
-
实际开发中,使用第2种方案,在.gitignore同级目录下创建.env文件配置好调试环境,在线上忽略此文件就可以达到线上不用重新配置
前置操作
可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList属性可以指定某个方法为其他方法的前置操作,=数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法=,因为前置操作方法调用在think\Controller类中,所以要继承它
<?php
namespace app\index\controller;
use think\Controller;
class Demo extends Controller
{
//前置方法列表
protected $beforeActionList=[
//数组没有键值的话表示为当前控制器下所有方法都使用前置方法
'beforeAc'=>['index'],
//except键名表示这些方法不使用前置方法
//'beforeAc'=>['except' => 'index3'],
//only键名表示这些方法使用前置方法
//'beforeAc'=>['only'=>'index']
];
protected function beforeAc(){
echo '我是前置方法<hr>';
}
public function index(){
echo 'php是世界上最好的语言';
}
public function index2(){
echo 'index2';
}
public function index3(){
echo 'index3';
}
}
页面跳转
系统的\think\Controller类内置了两个跳转方法success和error,用于页面跳转提示
代码示例
<?php
use think\facade\Route;
//定义控制器路由 模块/控制器类名/方法名 路由别名
Route::get('test','index/Index/test')->name('testAlias');
此方法可根据不同的请求方式http标准请求还是ajax请求会自动返回数据(html/json)