27、TP5路由绑定
入口绑定本章我们学习TP5的路由绑定知识。
1、以上一章
Demo
控制器为例,去除路由,以PATN_INFO
方式访问:http://tp5.com/index/demo/sub/20/1
,访问正常。
2、打开项目的入口文件:/public/index.php
,添加个系统常量:
//绑定到指定模块
define('BIND_MODULE','index');
3、这时候,以PATN_INFO
方式访问的时候,就可以省略掉index
模块:http://tp5.com/demo/sub/20/1
。也就是说,我们将所有的访问都绑定到了指定的模块上。
4、除了绑定到指定模块上,我们还能绑定到指定模块下的控制器上:
//绑定到指定模块下面的控制器上
define('BIND_MODULE','index/Demo');
5、这时候,我们就还能省略demo
控制器了,进一步简化URL
了:http://tp5.com/sub/20/1
。
这就是入口文件的绑定。
入口自动绑定
1、首先打开惯例配置文件:/thinkphp/convention.php
,找到auto_bind_module
,复制到自定义配置文件:/config/config.php
中,并修改为true
:
// 入口自动绑定模块
'auto_bind_module' => true,
2、创建一个新的入口文件:/public/admin.php
,写入:
<?php
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 自定义配置目录
define('CONF_PATH', __DIR__ . '/../config/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
3、我们的目标是要实现当访问admin.php
的时候能够自动和admin
模块绑定。
4、创建admin
模块:/application/admin/controller/Index.php
,写入:
<?php
namespace app\admin\controller;
class Index
{
public function index()
{
return '我是admin.php入口文件对应的模块下面的方法';
}
}
5、这样,当我们输入http://tp5.com/admin.php
,就会自动执行admin
模块下默认控制器下的默认方法。
动态绑定
1、继续以上一章的
Demo
控制器为例子,正常访问url
为:http://tp5.com/index/demo/add/10/11
。
2、在/config/route.php
文件中进行动态路由绑定:
think\Route::bind('index');//绑定到模块
3、绑定了模块后,省略index
模块:http://tp5.com/demo/add/10/11
。
4、还可以绑定到控制器:
think\Route::bind('index/Demo');//绑定到控制器
这样连控制器都可以不写了:http://tp5.com/add/10/11
。
5、甚至还能绑定到操作:
think\Route::bind('index/Demo/add');//绑定到操作
这时候访问的url
简化到发指:http://tp5.com/10/11
。
绑定到命名空间或者类
1、Demo
控制器和Index
控制器的命名空间都是app\index\controller
,也就是说,如果将命名空间绑定到app\index\controller
,那么所有使用该命名空间的控制器,都能直接使用。
2、修改/config/route.php
文件:
think\Route::bind('app\index\controller','namespace');
3、那么该命名空间下,我们可以直接写控制器名称来访问:http://tp5.com/index/test/mike/21
或者http://tp5.com/demo/add/3/21
都可以直接访问。
4、我们还能绑定到命名空间指定的类:
think\Route::bind('app\index\controller\Demo','class');
5、那么当类被绑定后,我们就能直接访问到该类的方法:http://tp5.com/add/3/21
。
这种直接绑定到命名空间和类的,会直接跳过模块配置文件和公共文件。
1、我们在自定义配置目录下为index
模块创建配置文件:/config/index/config.php
,写入:
<?php
return [
'my_frame' => 'TP5',
];
2、修改/config/route.php
文件的路由绑定:
think\Route::bind('app\index\controller\index','class');
3、修改index
控制器中的方法,返回刚才写的模块配置项:
public function test()
{
dump(Config::get('my_frame'));
}
4、访问看看:http://tp5.com/test
,发现访问不到,输出一个NULL
。
从而证实了这种绑定方式确实是会跳过模块配置文件和公共文件,需要注意。
路由绑定可以极大的简化项目开发,使开发流程更加清晰可控。