效果
假设网站域名是A.com,那么可以:
通过A.com/xwzx.html
访问A.com/Home/News/index.html?id=xwzx
或者通过A.com/xwzx_1.html
访问A.com/Home/News/index.html?id=xwzx&p=1
最关键的是:
使用U('Home/News/index', array('id'=>xwzx))
生成A.com/xwzx.html
链接
或者使用U('Home/News/index', array('id'=>xwzx,'p'=>1))
生成A.com/xwzx_1.html
链接
以此类推
目的
其实ThinkPHP3.2.3的路由部分使用场景并不多,究其原因是因为路由规则可以设置并正常访问,但是却没有自动生成路由的方法。比如说你配置完一个路由规则A.com/xwzx.html是可以正常访问的,却发现有大量的链接U('Home/News/index', array('id'=>xwzx))需要修改为/xwzx.html,使用的U方法并不能自动完成转化。
所以我们的目的就是,让U方法可以根据路由规则反推出伪静态的链接。这样做有什么好处呢?
- 如果有老项目需要配置全站的伪静态规则,这样做可以减少工作量,一切只需要配置即可。
- 在需要发起支付的页面,通常会带多个参数,这样就不利于我们配置支付接口的发起地址,此时用这个方法可以把多个参数合并到同一段URL中。更多支付接口配置内容请参考PHP支付接口教程,详解微信支付(一)
- 不需要做项目之前就事先处理伪静态页面,只需要正常写U方法即可,加快开发速度。
思路
修改ThinkPHP底层的U方法,当路由规则开启时,通过规则反推出伪静态链接。
配置规则同ThinkPHP官方的文档,Application/Common/Conf/config.php配置如下:
'URL_ROUTER_ON' => true, // 开启URL路由
'URL_ROUTE_RULES' => array(
//'CGIIP/:id/:p'=>'Home/News/index',
'/^([A-Za-z0-9]+)$/'=>'Home/News/index?id=:1',
'/^([A-Za-z0-9]+)_(d+)$/'=>'Home/News/index?id=:1&p=:2',
'4O4'=>'Admin/Index/notFound',
'test'=>'Home/Index/test',
), // 路由规则
修改ThinkPHP/Common/functions.php里面的U方法:
<script src="https://gist.coding.net/u/fourn/60d20945c81645b3b826330896c0fa93.js"></script>
完整functions.php文件代码在Coding中:
代码放到U方法中,“if($suffix){”这行代码之前。
注意这些都是针对ThinkPHP3.2.3版本的哦