thinkPHP定义路由

URL地址里面的index模块怎么才能省略呢,默认的URL地址显得有点长,下面就来说说如何通过路由简化URL访问。

我们在路由定义文件(application/route.php)里面添加一些路由规则,如下:

return [
    // 添加路由规则 路由到 index控制器的hello操作方法
    ‘hello/:name‘ => ‘index/index/hello‘,
];

该路由规则表示所有hello开头的并且带参数的访问都会路由到index控制器的hello操作方法。

路由之前的URL访问地址为:

http://tp5.com/index/index/hello/name/thinkphp

定义路由后就只能访问下面的URL地址

http://tp5.com/hello/thinkphp

注意



定义路由规则后,原来的URL地址将会失效,变成非法请求。

但这里有一个小问题,如果我们只是访问

http://tp5.com/hello

将发生错误,

事实上这是由于路由没有正确匹配到,我们修改路由规则如下:

return [
    // 路由参数name为可选
    ‘hello/[:name]‘ => ‘index/hello‘,
];

使用[]把路由规则中的变量包起来,就表示该变量为可选,接下来就可以正常访问了。

http://tp5.com/hello

name参数没有传入值的时候,hello方法的name参数有默认值World,所以输出的内容为 Hello,World!

除了路由配置文件中定义之外,还可以采用动态定义路由规则的方式定义,例如在路由配置文件(application/route.php)的开头直接添加下面的方法:

use think\Route;

Route::rule(‘hello/:name‘, ‘index/hello‘);

完成的效果和使用配置方式定义是一样的。

无论是配置方式还是通过Route类的方法定义路由,都统一放到路由配置文件application/route.php文件中,具体原因后面会揭晓。

提示:



注意路由配置不支持在模块配置文件中设置。

完整匹配

前面定义的路由是只要以hello开头就能进行匹配,如果需要完整匹配,可以使用下面的定义:

return [
    // 路由参数name为可选
    ‘hello/[:name]$‘ => ‘index/hello‘,
];

当路由规则以$结尾的时候就表示当前路由规则需要完整匹配。

当我们访问下面的URL地址的时候:

http://tp5.com/hello // 正确匹配
http://tp5.com/hello/thinkphp // 正确匹配
http://tp5.com/hello/thinkphp/val/value // 不会匹配

闭包定义

还支持通过定义闭包为某些特殊的场景定义路由规则,例如:

return [
    // 定义闭包
    ‘hello/[:name]‘ => function ($name) {
        return ‘Hello,‘ . $name . ‘!‘;
    },
];

或者

use think\Route;

Route::rule(‘hello/:name‘, function ($name) {
    return ‘Hello,‘ . $name . ‘!‘;
});

提示:



闭包函数的参数就是路由规则中定义的变量。

因此,当访问下面的URL地址:

http://tp5.com/hello/thinkphp

会输出

Hello,thinkphp!

设置URL分隔符

如果需要改变URL地址中的pathinfo参数分隔符,只需要在应用配置文件(application/config.php)中设置:

// 设置pathinfo分隔符
‘pathinfo_depr‘          => ‘-‘,

路由规则定义无需做任何改变,我们就可以访问下面的地址:

http://tp5.com/hello-thinkphp

路由参数

我们还可以约束路由规则的请求类型或者URL后缀之类的条件,例如:

return [
    // 定义路由的请求类型和后缀
    ‘hello/[:name]‘ => [‘index/hello‘, [‘method‘ => ‘get‘, ‘ext‘ => ‘html‘]],
];

上面定义的路由规则限制了必须是get请求,而且后缀必须是html的,所以下面的访问地址:

http://tp5.com/hello // 无效
http://tp5.com/hello.html // 有效
http://tp5.com/hello/thinkphp // 无效
http://tp5.com/hello/thinkphp.html // 有效

更多的路由参数请参考完全开发手册的路由参数一节。

变量规则

接下来,我们来尝试一些复杂的路由规则定义满足不同的路由变量。在此之前,首先增加一个控制器类如下:

<?php

namespace app\index\controller;

class Blog
{

    public function get($id)
    {
        return ‘查看id=‘ . $id . ‘的内容‘;
    }

    public function read($name)
    {
        return ‘查看name=‘ . $name . ‘的内容‘;
    }

    public function archive($year, $month)
    {
        return ‘查看‘ . $year . ‘/‘ . $month . ‘的归档内容‘;
    }
}

添加如下路由规则:

return [
    ‘blog/:year/:month‘ => [‘blog/archive‘, [‘method‘ => ‘get‘], [‘year‘ => ‘\d{4}‘, ‘month‘ => ‘\d{2}‘]],
    ‘blog/:id‘          => [‘blog/get‘, [‘method‘ => ‘get‘], [‘id‘ => ‘\d+‘]],
    ‘blog/:name‘        => [‘blog/read‘, [‘method‘ => ‘get‘], [‘name‘ => ‘\w+‘]],
];

在上面的路由规则中,我们对变量进行的规则约束,变量规则使用正则表达式进行定义。

我们看下几种URL访问的情况

// 访问id为5的内容
http://tp5.com/blog/5
// 访问name为thinkphp的内容
http://tp5.com/blog/thinkphp
// 访问2015年5月的归档内容
http://tp5.com/blog/2015/05

路由分组

上面的三个路由规则由于都是blog打头,所以我们可以做如下的简化:

return [
    ‘[blog]‘ => [
        ‘:year/:month‘ => [‘blog/archive‘, [‘method‘ => ‘get‘], [‘year‘ => ‘\d{4}‘, ‘month‘ => ‘\d{2}‘]],
        ‘:id‘          => [‘blog/get‘, [‘method‘ => ‘get‘], [‘id‘ => ‘\d+‘]],
        ‘:name‘        => [‘blog/read‘, [‘method‘ => ‘get‘], [‘name‘ => ‘\w+‘]],
    ],
];

对于这种定义方式,我们称之为路由分组,路由分组一定程度上可以提高路由检测的效率。

复杂路由

有时候,我们还需要对URL做一些特殊的定制,例如如果要同时支持下面的访问地址

http://tp5.com/blog/thinkphp
http://tp5.com/blog-2015-05

我们只要稍微改变路由定义规则即可:

return [
    ‘blog/:id‘            => [‘blog/get‘, [‘method‘ => ‘get‘], [‘id‘ => ‘\d+‘]],
    ‘blog/:name‘          => [‘blog/read‘, [‘method‘ => ‘get‘], [‘name‘ => ‘\w+‘]],
    ‘blog-<year>-<month>‘ => [‘blog/archive‘, [‘method‘ => ‘get‘], [‘year‘ => ‘\d{4}‘, ‘month‘ => ‘\d{2}‘]],
];

对 blog-<year>-<month> 这样的非正常规范,我们需要使用<变量名>这样的变量定义方式,而不是 :变量名方式。

简单起见,我们还可以把变量规则统一定义,例如:

return [
    // 全局变量规则定义
    ‘__pattern__‘         => [
        ‘name‘  => ‘\w+‘,
        ‘id‘    => ‘\d+‘,
        ‘year‘  => ‘\d{4}‘,
        ‘month‘ => ‘\d{2}‘,
    ],
    // 路由规则定义
    ‘blog/:id‘            => ‘blog/get‘,
    ‘blog/:name‘          => ‘blog/read‘,
    ‘blog-<year>-<month>‘ => ‘blog/archive‘,
];

__pattern__中定义的变量规则我们称之为全局变量规则,在路由规则里面定义的变量规则我们称之为局部变量规则,如果一个变量同时定义了全局规则和局部规则的话,当前的局部规则会覆盖全局规则的,例如:

return [
    // 全局变量规则
    ‘__pattern__‘         => [
        ‘name‘  => ‘\w+‘,
        ‘id‘    => ‘\d+‘,
        ‘year‘  => ‘\d{4}‘,
        ‘month‘ => ‘\d{2}‘,
    ],

    ‘blog/:id‘            => ‘blog/get‘,
    // 定义了局部变量规则
    ‘blog/:name‘          => [‘blog/read‘, [‘method‘ => ‘get‘], [‘name‘ => ‘\w{5,}‘]],
    ‘blog-<year>-<month>‘ => ‘blog/archive‘,
];

【 5.1 】使用须知



5.1的路由配置文件改为route/route.php,并且支持随意命名,都会自动加载。并尽量使用方法注册路由的方式替代数组配置的方式,例如。

use think\facade\Route;

Route::get(‘blog/:id‘,‘blog/get‘);
Route::get(‘blog/:name‘,‘blog/read‘);

原文地址:https://www.cnblogs.com/xu1115/p/10977620.html

时间: 2024-10-29 18:10:58

thinkPHP定义路由的相关文章

ThinkPHP URL 路由功能详解与实例

本节内容导读 本节内容主要介绍 ThinkPHP 路由功能与 U方法的使用,分为下面几个部分: ThinkPHP URL 路由功能详解:见本页下面文字 ThinkPHP 正则路由与实例 ThinkPHP U方法:使用U方法自动生成URL超链接 ThinkPHP 3.0 版本的路由功能较 2.x 版本有较大的变更,如果您的版本是 2.x,请参阅下面的文档: ThinkPHP 2.0 URL 路由(2.0版本适用) ThinkPHP 泛路由使用详解(2.0版本适用) ThinkPHP 2.1 路由规

thinkphp 规则路由

规则路由是一种比较容易理解的路由定义方式,采用ThinkPHP设计的规则表达式来定义. 规则表达式 规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式: 'my' => 'Member/myinfo', // 静态地址路由 'blog/:id' => 'Blog/read', // 静态地址和动态地址结合 'new/:year/:month/:day'=>'News/read', // 静态地址和动态地址结合 ':user/:blog_id' =&g

在做ionic使用ui-router定义路由的时候遇到的奇葩问题

在定义路由的时候我这样子定义的时候是有问题的.购物车和个人是属于同一级 都是tab.然后第一次点击购物车的时候渲染的竟然是个人.而且还会选中个人tab.这问题不知道为毛会这样.先说一下个人是最后一个tab .然后如果其他tab定义的url和最后一个tab的url前面有一样的话就会出现奇葩问题.我感觉第一个tab和其他也可能会有这个问题.//购物车.state('tab.cart', { url: '/user-cart', cache: false, views: { 'tab-cart': {

AngularJS之基础-5 路由(定义路由、使用路由)、自定义指令(Directive)

一.定义路由 ng-view - AngularJS 支持通过在单页面上的多个视图的单页应用 - ng-view 标记只是简单地创建一个占位符 - 使用 ng-template - 创建使用script标签的HTML视图 - 使用 - 定义类型作为主模块中 ng-template 的脚本块 $routeProvider - 映射相应的HTML页面或ng-template - 附加一个控制器使用相同键的服务   - 注意: - 需要angular-route.js脚本文件的引用 二.使用路由 锚点

sails route(1) -用户定义路由

sails支持两种类型的路由: custom(or "explicit") andautomatic(or "implicit"). 先来看一下custom 即用户定义路由吧,以下是学习笔记. 用户定义路由 在config/routes.js中定义如下类似的路由: module.exports.routes={ 'get/signup': { view: 'conversion/signup' }, 'post /signup':'AuthController.pr

vue 实例化定义路由

const Home = Vue.extend({ template: '', data: function() { return {} }, mounted () { } }) Vue.extend返回的是一个"扩展实例构造器",也就是预设了部分选项的Vue的实例构造器,它常常服务于Vue.component用来生成组件,可以简单理解为当在模板中遇到该组件作为标签的自定义元素时,会自动调用"扩展实例构造器"来生产组件实例,并挂在到自定义元素上 const rout

thinkphp 正则路由

正则路由也就是采用正则表达式定义路由的一种方式,依靠强大的正则表达式,能够定义更灵活的路由规则. 路由表达式支持的正则定义必须以“/”开头,否则就视为规则表达式.也就是说如果采用: '#^blog\/(\d+)$#' => 'Blog/read/id/:1' 方式定义的正则表达式不会被支持,而会被认为是规则表达式进行解析,从而无法正确匹配. 下面是一种正确的正则路由定义: '/^new\/(\d{4})\/(\d{2})$/' => 'News/achive?year=:1&month

ionic中定义路由的问题

最近做一个ionic的app项目,发现ionic的路由方式并不是很灵活.期间在路由跳转上遇到了很多的问题,这里直接上问题: 1.   在这个app中,我要实现除了首页.分类页.购物车.个人中心这4个页面有tabs外,其它页面都不要tabs.如何实现? 这个很简单啊,在其它页面中隐藏掉tabs就行了.在路由中定义一个$rootscope.hideTabs变量,通过设置其值为true或false来控制是否隐藏tabs,但是这种方式很繁琐,要在没个view对应的contraller中都设置一遍值,而且

thinkphp 静态路由

静态路由其实属于规则路由的静态简化版(又称为URL映射),路由定义中不包含动态参数,静态路由不需要遍历路由规则而是直接定位,因此效率较高,但作用也有限. 如果我们定义了下面的静态路由 'URL_ROUTER_ON' => true, 'URL_MAP_RULES'=>array( 'new/top' => 'news/index?type=top' ) 注意:为了不影响动态路由的遍历效率,静态路由采用URL_MAP_RULES定义和动态路由区分开来 定义之后,如果我们访问: http:/