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

そして、同じ設定を使用することによって達成効果が定義されています。

ルートクラスの経路によって定義される構成方法は、ルーティング・コンフィギュレーション・ファイルに統合されているかどうか、またはapplication/route.phpファイル、具体的な理由については、後に発表されます。

ヒント:


ルーティングの設定はモジュール構成ファイルでサポートされていません。

正確なヒット

ルーティングはマッチが、ハローから始めることができますが、完全一致をしたい場合、あなたは以下の定義を使用することができます限り、先に定義されています。

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

おすすめ

転載: www.cnblogs.com/xu1115/p/10977620.html