编程语言ThinkPHP路由详解

编程语言ThinkPHP路由详解

ThinkPHP路由通俗的说,他是一个url的传输规则,例如:index.php?g=Homem=Indexa=price 这个规则也是可以变化的, 可以设置为@或者其他,规则主要有pathinfo等,

有了基本配置,我们就可以来访问我们的应用默认首页了。进入到项目目录,可以直接使用PHP内置服务器来开始访问,比如:

php -S localhost:8999

浏览器输入localhost:8999就可以看到ThinkPHP的默认首页了:一个笑脸。

在这里,我们访问到的是ThinkPHP自带的默认入口文件index.php也就是访问到的是IndexController的index()方法,这是因为ThinkPHP默认设置:

'DEFAULT_CONTROLLER' => 'Index'

如果你查看过ThinkPHP/Conf/convention.php文件,应该就会明白这个其实就是设置默认的控制器。

关于控制器(Controller)我们后面会仔细说

了解这些基本知识之后,那么如果我们需要访问其它的页面,访问其他的控制器和方法呢?答案就在本节的路由教程中。

路由定义规则

在使用路由之前,确保你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能)并且确认已开启一下的路由设置:

'URL_ROUTER_ON' => true

这里涉及到两个设置项,PATH_INFO和URL_ROUTER_ON,这些在ThinkPHP/Conf/convention.php文件都可以找到。

在满足以上两个条件之后,就可以配置路由规则了。在配置文件中使用URL_ROUTE_RULES参数进行配置,配置格式是一个数组,其格式为: '路由表达式'=>'路由地址和传入参数'每个元素都代表一个路由规则,比如:

'URL_ROUTE_RULES'=>array( 'blogs/:year/:month/:day' => array('Index/archive', 'status=1'), 'blogs/:id' => 'Index/read', ),

ThinkPHP按定义的顺序依次匹配路由规则,一旦匹配到的话,就会定位到路由定义中的控制器和操作方法去执行(你可以传入其他的参数),而后面的规则不会继续匹配

以上的路由配置说明:在每个路由表达式中,:后面跟参数名称,比如上面的:year,:month,:id都是参数名称,以:id为例,它指向Index控制器的read方法,这个方法接受一个$id的参数:

public function read($id){ echo "read page with" .$id; }

在浏览器输入:8999/index.php/Home/blogs/2就可以看到

read page with 2

Home就代表Home模块,你可以简单地将它映射到相应的Home目录,这是由于在默认的配置中

'DEFAULT_MODULE' => 'Home'

你可以根据自己的需求修改,但本课依旧采用默认的Home模块.

如果你还需要传人额外的参数,像第一条的规则array('Index/archive', 'status=1')中的status一样传人,你看设置多个这样的参数。

如果你尝试在浏览器输入:

:8999/index.php/Home/blogs/string

ThinkPHP也给我们返回了string,但在日常的开发中,我们通常需要限制:id变量是整数,,那该怎么做呢?只需要稍稍改动就可以了,写成

'blogs/:id\d' => 'Index/read',

以上\d表示限制变量id只能是数字。

对于可选参数,可以用[]包含表示,比如:

'blogs/:year/:month/[:day]' => array('Index/archive', 'status=1'),

上面的day现在就是可选参数了,你可以传人,也可以不传。

在ThinkPHP中,还支持在限制路由的后缀和使用正则路由。

限制路由后缀,通常使用在平时常见的html,htm等后缀,还是以上面的规则为例:

'blogs/:id' => array('Index/read',array('ext'=>'html'))

你就可以限制这条规则只能在.html的路由后缀生效。

正则路由

正则本身就是一门很大的学问,在学习ThinkPHP的正则路由之前,最好是具备一定的正则表达式的基础。

路由表达式支持的正则定义必须以/开头,否则就视为规则表达式,比如:

'#^blog\/(\d+)$#' => 'Index/read'

这会解析为规则路由而不是正则路由,因为录音表达式并没有以/开始,所以,我们需要这样写:

'/^new\/(\d{4})\/(\d{2})$/' => 'Index/achive?year=:1&month=:2',
以上就是一条正确的正则路由。对于正则表达式中的每个正则规则子模式)部分(如\d{4}和\d{2}),如果需要在后面的路由地址中引用,可以采用:1、:2这样的方式,序号就是子模式的序号

静态路由

ThinkPHP框架其实还有一个路由机制叫静态路由,这实际上就是规则路由的静态简化版,路由定义中不包含动态参数(如上面的路由规则中id参数),静态路由不需要遍历路由规则而是直接定位,因此执行效率会较高。静态路由采用URL_MAP_RULES来定义规则:

'URL_ROUTER_ON' => true, 'URL_MAP_RULES'=>array( 'new/top' => 'Index/top?type=top' )

由于Index/top?type=top中Index表示控制器,第一个top表示方法,所以我们需要在Index控制器中创建top方法:

public function top(){ echo "top page
"; }

根据上面这条规则,如果我们访问到

:8999/index.php/Home/new/top

其实我们访问的是:

:8999/index.php/Home/index/top/type/top
转译成就是new/top对应的是index控制器的top方法,传人的参数为type,参数值为top,所以就有了index/top/type/top

但是,当我们访问:8999/index.php/Home/new/top/var/test尽管URL地址前面也有new/top,然而由于静态路由是完整匹配的性质,所以不会匹配到index/top/type/top

以上所述就是本文的全部内容了,希望大家能够喜欢。

文章来源:https://www.php.cn/faq/93333.html

百度网盘搜索
www.ijzcn.cn
阿哇教育
www.awaedu.com
作文哥
www.zuowenge.cn
搜码吧
www.somanba.cn
(0)

相关推荐

  • thinkPHP定义路由

    URL地址里面的index模块怎么才能省略呢,默认的URL地址显得有点长,下面就来说说如何通过路由简化URL访问. 我们在路由定义文件(application/route.php)里面添加一些路由规则 ...

  • 闭包支持

    闭包定义 我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了 参数传递 闭包定义的参数传递在规则路由和正则路由的两种情况下有所区别. 规则路由 规则路由的参数传递比较简单: ...

  • URL生成

    为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响. 定义规则 ...

  • 系统流程

    我们来系统的了解下ThinkPHP框架开发的应用的标准执行流程: 用户URL请求 调用应用入口文件(通常是网站的index.php) 载入框架入口文件(ThinkPHP.php) 记录初始运行时间和内 ...

  • 路由定义

    启用路由 要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能),并且在应用(或者模块)配置文件中开启路由: // 开启路由'UR ...

  • 规则路由

    规则表达式 规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式: 'my' => 'Member/myinfo', // 静态地址路由'blog/:id' ...

  • 71张图详解IP 地址、IP 路由、分片和重组、三层转发、ARP、ICMP

    来自公众号:网络技术平台 目录 有小伙伴问:为什么没有配置 IP 地址就无法上网?IP 协议又是啥? 这要从 TCP/IP 协议说起,互联网使用的是 TCP/IP 协议,其中 IP 协议又是最重要的协 ...

  • 71张图详解IP地址、IP 路由、三层转发、ARP、ICMP

    目录 有小伙伴问:为什么没有配置 IP 地址就无法上网?IP 协议又是啥? 这要从 TCP/IP 协议说起,互联网使用的是 TCP/IP 协议,其中 IP 协议又是最重要的协议之一.IP 协议是基于 ...

  • PLC编程语言/操作指令/使用步骤详解

    一.PLC编程语言 1.梯形图编程语言 梯形图沿袭了继电器控制电路的形式,它是在电器控制系统中常用的继电器.接触器逻辑控制基础上简化了符号演变来的,形象.直观.实用. 梯形图的设计应注意以下三点: ( ...

  • 如何配置静态路由?这两个实例详解交换机与路由器的配置

    如何配置静态路由?无论是项目中交换机的静态路由配置,还是在公司网络中路由器的静态路由设置,都有非常多的应用,前段时间在弱电VIP群中也陆陆续续有不少朋友问到,本期我们一起来了解关于静态路由在交换机与路 ...

  • 华为 三层交换机VLAN间路由配置详解

    实验拓扑 实验需求 1.C1与C3属于VLAN10,C2与C4属于VLAN20,在SW1上创建VLAN100做上行VLAN 2.在SW1上终结所有VLAN 3.在所有VLAN成员使用DHCP获取IP ...

  • 【超详解】怎么在网络上配置IP路由?

    【超详解】怎么在网络上配置IP路由?

  • OSPF路由控制知识详解~~

     OSPF路由控制 OSPF路由控制概述 OSPF的路由控制包括: 调整OSPF的接口开销 设置等价路由 引入外部路由 路由聚合 缺省路由通告 Filter-Policy 对发送的LSA进行过滤 对A ...

  • 【超详解】IPv6静态路由课堂知识(一)

    IPv6静态路由 IPv6静态路由与IPv4静态路由类似,也需要管理员手工配置,适合于一些结构比较简单的IPv6网络. 在创建IPv6静态路由时,可以同时指定出接口和下一跳,或者只指定出接口或只指定下 ...

  • IP路由原理——技术详解

    一. 路由工作原理: https://m.toutiao.com/is/Jp9ffnF/ 路由转发数据过程其实很简单,简单的总结就是: 路由接收数据包→查看目的地址→与路由表进行匹配找到转发端口→转发 ...