在线文档教程
Codeigniter 3

URI路由 | URI Routing

URI路由

通常,URL字符串与其相应的控制器类/方法之间存在一对一的关系。URI中的段通常遵循以下模式:

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允许您重新映射URI处理程序。

设置自己的路由规则

路由规则在application/config/routeres.php档案。在其中,您将看到一个名为$route它允许您指定自己的路由条件。可以使用通配符或正则表达式指定路由。

通配符

典型的通配符路径可能如下所示:

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

在路由中,数组键包含要匹配的URI,而数组值包含应该重新路由到的目标。在上面的示例中,如果在URL的第一个段中找到字面词“product”,并且在第二个段中找到了一个数字,则会使用“catalog”类和“product_lookup”方法。

可以匹配文字值,也可以使用两种通配符类型:

(:num)将匹配仅包含数字的段。(:any)将匹配包含任何字符的段(除了'/',这是段分隔符)。

通配符实际上是正则表达式的别名,其中:任何被分别转换为^ / +:num的值为0-9 +

路由将按照定义的顺序运行。较高的路线总是优先于较低的路线。

路由规则不是过滤器!设置例如'foo / bar /(:num)'的规则不会阻止控制器Foo和方法被非数字值调用(如果这是有效的路由)。

实例

下面是一些路由示例:

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

第一段中包含“日志”一词的URL将被映射到“blog”类。

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

包含Blog/Joe段的URL将被映射到“blog”类和“User”方法。ID将被设置为“34”。

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

将“产品”作为第一个细分受众群的网址,第二个细分受众群中的任何内容都会重新映射到“目录”类和“product_lookup”方法。

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

将“产品”作为第一个片段,第二个片段中的数字将被重新映射到“目录”类,“product_lookup_by_id”方法将匹配作为变量传递给方法。

重要

不要使用前导/尾随斜杠。

正则表达式

如果您愿意,可以使用正则表达式来定义路由规则。任何有效的正则表达式都是允许的,反向引用也是如此。

如果使用反向引用,则必须使用美元语法而不是双反斜杠语法。

一个典型的RegEx路线看起来可能如下所示:

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

在上面的例子中,类似于products / shirts / 123的URI将改为调用“shirts”控制器类和“id_123”方法。

使用正则表达式,您还可以一次捕获多个段。例如,如果用户访问Web应用程序的密码保护区域,并且希望能够在他们登录后将其重定向回同一页,您可能会发现这个示例很有用:

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

在上面的例子中,如果$1占位符包含一个斜杠,当它传递给它时它仍然会被拆分成多个参数Auth::login()

对于那些不知道正则表达式并想了解更多正则表达式的人,正则表达式。也许是个好的起点。

还可以将通配符与正则表达式混合和匹配。

回调

您还可以使用回调代替常规的路由规则来处理回退引用。例子:

$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';

在上面的示例中,对URI“Products”的PUT请求将调用Product::insert()控制器方法

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

删除以“Products”作为第一个片段的URL请求,并将第二个片段中的数字映射到Product::delete()方法,将数值作为第一个参数传递。

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

预留路线

有三条预留路线:

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

此路由指向在URI不包含数据时应该执行的操作,当用户加载根URL时就是如此。设置接受控制器/方法价值和index()如果不指定方法,则为默认方法。在上面的例子中,它是Welcome::index()那会被称为。

您不能使用目录作为此设置的一部分!

我们鼓励您始终使用默认路由,否则默认情况下将出现404页。

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

如果未找到请求的控制器,则此路线指示应加载哪个控制器类。它将覆盖默认的404错误页面。与'default_controller'相同的每个目录规则也适用于此处。

它不会影响该show_404()函数,该函数将继续在application / views / errors / error_404.php中加载默认的error_404.php文件。

$route['translate_uri_dashes'] = FALSE;

如布尔值所示,这不完全是一条路线。该选项使您能够自动替换控制器中的下划线和方法URI段的破折号(' - '),从而在需要时为您节省额外的路由条目。这是必需的,因为破折号不是有效的类或方法名称字符,并且如果尝试使用它会导致致命错误。