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段的破折号(' - '),从而在需要时为您节省额外的路由条目。这是必需的,因为破折号不是有效的类或方法名称字符,并且如果尝试使用它会导致致命错误。