php框架中uri路由机制,URI 路由 — CodeIgniter 3.1.5 中文手册|用户手册|用户指南|中文文档...

URI 路由¶

一般情况下,一个 URL 字符串和它对应的控制器中类和方法是一一对应的关系。

URL 中的每一段通常遵循下面的规则:

example.com/class/function/id/

但是有时候,你可能想改变这种映射关系,调用一个不同的类和方法,而不是

URL 中对应的那样。

例如,假设你希望你的 URL 变成下面这样:

example.com/product/1/

example.com/product/2/

example.com/product/3/

example.com/product/4/

URL 的第二段通常表示方法的名称,但在上面的例子中,第二段是一个商品 ID ,

为了实现这一点,CodeIgniter 允许你重新定义 URL 的处理流程。

设置你自己的路由规则¶

路由规则定义在 application/config/routes.php 文件中,在这个文件中你会

发现一个名为 $route 的数组,利用它你可以设置你自己的路由规则。

在路由规则中你可以使用通配符或正则表达式。

通配符¶

一个典型的使用通配符的路由规则如下:

$route['product/:num'] = 'catalog/product_lookup';

在一个路由规则中,数组的键表示要匹配的 URI ,而数组的值表示要重定向的位置。

上面的例子中,如果 URL 的第一段是字符串 "product" ,第二段是个数字,那么,

将调用 "catalog" 类的 "product_lookup" 方法。

你可以使用纯字符串匹配,或者使用下面两种通配符:

(:num) 匹配只含有数字的一段。

(:any) 匹配含有任意字符的一段。(除了 '/' 字符,因为它是段与段之间的分隔符)

注解

通配符实际上是正则表达式的别名,:any 会被转换为 [^/]+ ,

:num 会被转换为 [0-9]+ 。

注解

路由规则将按照它们定义的顺序执行,前面的规则优先级高于后面的规则。

注解

路由规则并不是过滤器!设置一个这样的路由:'foo/bar/(:num)' ,

Foo 控制器的 bar 方法还是有可能会通过一个非数字的参数被调用

(如果这个路由也是合法的话)。

例子¶

这里是一些路由的例子:

$route['journals'] = 'blogs';

URL 的第一段是单词 "journals" 时,将重定向到 "blogs" 类。

$route['blog/joe'] = 'blogs/users/34';

URL 包含 blog/joe 的话,将重定向到 "blogs" 类和 "users" 方法。ID 参数设为 "34" 。

$route['product/(:any)'] = 'catalog/product_lookup';

URL 的第一段是 "product" ,第二段是任意字符时,将重定向到 "catalog" 类的

"product_lookup" 方法。

$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';

URL 的第一段是 "product" ,第二段是数字时,将重定向到 "catalog" 类的

"product_lookup_by_id" 方法,并将第二段的数字作为参数传递给它。

重要

不要在前面或后面加反斜线('/')。

正则表达式¶

如果你喜欢,你可以在路由规则中使用正则表达式。任何有效的正则表达式都是

允许的,包括逆向引用。

注解

如果你使用逆向引用,你需要使用美元符号代替双斜线语法。

一个典型的使用正则表达式的路由规则看起来像下面这样:

$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';

上例中,一个类似于 products/shirts/123 这样的 URL 将会重定向到 "shirts"

控制器的 "id_123" 方法。

With regular expressions, you can also catch multiple segments at once.

例如,当一个用户访问你的 Web 应用中的某个受密码保护的页面时,如果他没有

登陆,会先跳转到登陆页面,你希望在他们在成功登陆后重定向回刚才那个页面,

那么这个例子会很有用:

$route['login/(.+)'] = 'auth/login/$1';

注解

In the above example, if the $1 placeholder contains a

slash, it will still be split into multiple parameters when

passed to Auth::login().

如果你还不知道正则表达式,可以访问 regular-expressions.info 开始学习一下。

注解

你也可以在你的路由规则中混用通配符和正则表达式。

回调函数¶

你可以在路由规则中使用回调函数来处理逆向引用。例如:

$route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id)

{

return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;

};

在路由中使用 HTTP 动词¶

还可以在你的路由规则中使用 HTTP 动词(请求方法),当你在创建 RESTful 应用时特别有用。

你可以使用标准的 HTTP 动词(GET、PUT、POST、DELETE、PATCH),也可以使用自定义的动词

(例如:PURGE),不区分大小写。你需要做的就是在路由数组后面再加一个键,键名为 HTTP

动词。例如:

$route['products']['put'] = 'product/insert';

上例中,当发送 PUT 请求到 "products" 这个 URI 时,将会调用 Product::insert() 方法。

$route['products/(:num)']['DELETE'] = 'product/delete/$1';

当发送 DELETE 请求到第一段为 "products" ,第二段为数字这个 URL时,将会调用

Product::delete() 方法,并将数字作为第一个参数。

当然,使用 HTTP 动词是可选的。

保留路由¶

有下面三个保留路由:

$route['default_controller'] = 'welcome';

This route points to the action that should be executed if the URI contains

no data, which will be the case when people load your root URL.

The setting accepts a controller/method value and index() would be

the default method if you don't specify one. In the above example, it is

Welcome::index() that would be called.

注解

You can NOT use a directory as a part of this setting!

You are encouraged to always have a default route as otherwise a 404 page

will appear by default.

$route['404_override'] = '';

这个路由表示当用户请求了一个不存在的页面时该加载哪个控制器,它将会覆盖默认的 404 错误页面。Same per-directory rules as with 'default_controller' apply here as well. show_404() 函数不会受影响,它还是会继续加载 application/views/errors/ 目录下的默认的 error_404.php 文件。

$route['translate_uri_dashes'] = FALSE;

从它的布尔值就能看出来这其实并不是一个路由,这个选项可以自动的将 URL

中的控制器和方法中的连字符('-')转换为下划线('_'),当你需要这样时,

它可以让你少写很多路由规则。由于连字符不是一个有效的类名或方法名,

如果你不使用它的话,将会引起一个严重错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程池的开源实现(mariadb和percona版本)

2019独角兽企业重金招聘Python工程师标准>>> 一、"Thread pool in MariaDB 5.5" 线程池解决的问题: 传统mysql使用一个线程处理一个客户端连接,如果许多的并发用户,将使性能下降。因为大量的线程将引起上下文交换&#…

C++之goto

1 goto code: result:

表单-登陆框

一、实现登陆框 1、用到【form】【caption】【table】【method】 2、用户名 <input type"text" name"uername"> 3、密码 <input type"password" name"mima"> 4、注册 <td aling"center" colspan"1"…

[译]9条关于高性能ElasticSearch的配置建议

原文链接:https://www.loggly.com/blog/nine-tips-configuring-elasticsearch-for-high-performance/Loggy使用ES作为其很多核心功能的搜索引擎. 如Jon Gifford在最近的文章ElasticSearch vs Solr中所述, 日志管理系统对搜索引擎有特别需求, 具体如下: 对于大规模的数据索引具有…

ABP vNext微服务架构详细教程——结束语

ABP vNext微服务架构详细教程——简介ABP vNext微服务架构详细教程——架构介绍ABP vNext微服务架构详细教程——身份管理服务ABP vNext微服务架构详细教程——基础服务层ABP vNext微服务架构详细教程——聚合服务ABP vNext微服务架构详细教程——身份认证服务ABP vNext微服务架…

创建 linux分区命令,Linux中创建分区

在很多情况下我们可能需要在使用Linux的时候创建新的分区来帮助我们更好的学习和工作&#xff0c;接下来我就详细的介绍一下如何利用fdisk这条命令进行硬盘分区。Linux磁盘分区和windows存在区别&#xff0c;Linux分区分为三类 主分区 扩展分区 和逻辑分区。然而它们三个关系有…

Android studio之Error:(23, 17) Failed to resolve: junit:junit:4.12

1 probleam 2 resolve method // testCompile junit:junit:4.12

第27周六

今天去办理了公交卡转移保证金业务&#xff0c;又去送修了4s和n5两个手机&#xff0c;最后又陪她重新办了个移动卡&#xff0c;没有花10元去买什么卡槽&#xff0c;到中移动办业务那里自动给了卡槽试试没问题&#xff0c;后来又直接给补办了一张新卡&#xff0c;全新的设计能兼…

20杨氏矩阵查找

问题描述&#xff1a;在一个m行n列二维数组中&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中是否含有该整数。 例如下面的二维数组就…

玩一玩微信公众号开发(一) 接入系统

一开始我准备学一学微信开发。后来看了一下文档&#xff0c;需要自己搭服务器进行接口对调。有点麻烦所以就没继续学下去。现在学习过了Kotlin、Spring Boot很多东西&#xff0c;感觉可以比较方便的进行开发了。今天就来回过头学习一下。 准备工作 申请公众号 首先说明一下&…

linux 监控命令free,简单了解Linux性能监控命令free

在系统遇到各种IO瓶颈&#xff0c;内存使用率高&#xff0c;cpu使用率高等问题时&#xff0c;我们如何来定位错误&#xff1f;linux提供了很多命令来协助我们快速定位到错误&#xff0c;free命令是Linux最常用的命令之一&#xff1a;它可以查看系统的内存状况&#xff0c;包括服…

Android studio之NDK integration is deprecated in the current plugin解决办法

1 、问题 编译Android项目&#xff0c;出现下面错误 NDK integration is deprecated in the current plugin 2、解决办法 在我们 gradle.properties(Project Properties) file add android.useDeprecatedNdktrue

使用 System.Net.Http.Json 简化 HttpClient 的使用

使用 System.Net.Http.Json 简化 HttpClient 的使用Intro从 .NET Core 3.1 开始&#xff0c;微软添加了一个 System.Net.Http.Json 的扩展&#xff0c;可以用来简化 HttpClient 的使用&#xff0c;看到在很多项目里还并未开始使用&#xff0c;所以想向大家介绍一下SamplePostAs…

MySQL的四种不同查询的分析

1.前置条件&#xff1a;本次是基于小数据量&#xff0c;且数据块在一个页中的最理想情况进行分析&#xff0c;可能无具体的实际意义&#xff0c;但是可以借鉴到各种复杂条件下&#xff0c;因为原理是相同的,知小见大&#xff0c;见微知著&#xff01;打开语句分析并确认是否已经…

乐观锁的概念

乐观锁&#xff1a; 大多数是基于数据版本&#xff08;version&#xff09;的记录机制实现的。即为数据增加一个版本标识&#xff0c;在基于数据库表的版本解决方案中&#xff0c;一般是通过为数据库表添加一个“version”字段开实现读取数据时&#xff0c;将此版本号一同读出&…

.NET6之MiniAPI(十八):OpenAPI swagger

从本篇开始&#xff0c;介绍一些很不错的三方库&#xff0c;来丰富MiniAPI的使用。在创建MiniAPI项目时&#xff0c;模板提供了一个是否启用OpenAPI的选项&#xff0c;足见这个三方库的优势和强大。OpenAPI为我们测试API提供了强大的支持&#xff0c;调用API的开发人员&#xf…

查看linux内存还剩多少g,Linux 查看存储空间、内存以及清除内存

查看存储空间&#xff1a;zdsubuntu ~ $ df -hl文件系统 容量 已用 可用 已用% 挂载点udev 972M 0 972M 0% /devtmpfs 199M 6.3M 192M 4% /run/dev/sda1 23G 5.3G 17G 25% /tmpfs 992M 212K 991M 1% /dev/shmtmpfs 5.0M 4.0K 5.0M 1% /run/locktmpfs 992M 0 992M 0% /sys/fs/cg…

Android之ndk-build出现c:28:51: error: ‘get_string‘ undeclared here (not in a function)解决办法

1 problem ndk-build error: get_string undeclared here (not in a function) 2 resolve jstring get_strstring(JNIEnv* env, jobject thiz) {return (*env)->NewStringUTF(env, "I am chenyu, 动态注册JNI"); }jint add_int(JNIEnv* env, jobject jobj, ji…

c/c++与java------之JNI学习(一)

一、java 调用c/c 步骤&#xff1a; 1、在java类中创建一个native关键字声明的函数 2、使用javah生成对应的.h文件 3、在c/c中实现对应的方法 4、使用vs2012创建一个win32空白项目&#xff0c;将jdk中的jni.h和jni_md.h文件拷贝到工程中&#xff0c;修改项目属性为&#xff08;…

BeetleX服务网关授权配置

很多应用服务都需要授权访问&#xff0c;为了更好地统一处理这种授权验证&#xff0c;服务网关提供了JWT验证插件用于解决这问题。网关的JWT验证插件默认是关闭的&#xff0c;只有当开启后网关才会对请求进行拦截验证处理。开启开启JWT验证需要在插件管理里开启Webapi JWT验证插…