Thinkphp笔记 taro Posted on Mar 22 2021 PHP 开发 # 规则 默认的路由定义文件是`route.php`,但此目录下所有文件都是有效的 ``` ├─route 路由定义目录 │ ├─route.php 路由定义 │ ├─api.php 路由定义 │ └─... 更多路由定义 ``` 例子: ```php // 注册路由到index模块的News控制器的read操作 Route::rule('new/:id','index/News/read'); ``` 则当访问`http://serverName/new/5`会自动路由到 `http://serverName/index/news/read/id/5` 可以指定访问方式 ```php Route::rule('new/:id','News/update','POST'); Route::rule('new/:id','News/read','GET|POST'); ``` 快捷定义 ```php Route::get('new/:id','News/read'); // 定义GET请求路由规则 Route::post('new/:id','News/update'); // 定义POST请求路由规则 Route::put('new/:id','News/update'); // 定义PUT请求路由规则 Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则 Route::any('new/:id','News/read'); // 所有请求都支持的路由规则 ``` # 路由表达式 >路由表达式统一使字符串定义,采用规则定义的方式(不支持直接使用正则表达式,但支持给某个变量定义正则,参考后面的变量规则部分)。 ## 规则表达式 规则表达式通常包含静态地址和动态地址,或者两种地址的结合 ```php Route::rule('/', 'index'); // 首页访问路由 Route::rule('my', 'Member/myinfo'); // 静态地址路由 Route::rule('blog/:id', 'Blog/read'); // 静态地址和动态地址结合 Route::rule('new/:year/:month/:day', 'News/read'); // 静态地址和动态地址结合 Route::rule(':user/:blog_id', 'Blog/read'); // 全动态地址 ``` **每个参数中以:开头的参数都表示动态变量,并且会自动绑定到操作方法的对应参数。** ## 可选定义 变量用[ ]包含起来后就表示该变量是路由匹配的可选变量。 ```php Route::get('blog/:year/[:month]','Blog/archive'); ``` ## 完全匹配 规则匹配检测的时候默认只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望URL进行完全匹配,可以在路由表达式最后使用`$`符号,例如: ```php Route::get('new/:cate$', 'News/category'); ``` # 额外参数 在路由跳转的时候支持额外传入参数对(额外参数指的是不在URL里面的参数,隐式传入需要的操作中,有时候能够起到一定的安全防护作用,后面我们会提到)。例如: ```php Route::get('blog/:id','blog/read?status=1&app_id=5'); ``` # 路由标识 如果你需要快速的根据路由生成URL地址,可以在定义路由的时候指定生成标识(但要确保唯一)。 ```php // 注册路由到index模块的News控制器的read操作 <5.1.7 Route::name('new_read')->rule('new/:id','index/News/read'); // 注册路由到index模块的News控制器的read操作 >=5.1.7 Route::rule('new/:id','index/News/read')->name('new_read'); ``` 生成路由地址的时候就可以使用 ```php url('new_read',['id'=>10]); url('index/News/read',['id'=>10]); ``` # 变量规则 ## 局部变量规则 ```php Route::get('new/:name', 'News/read') ->pattern(['name' => '\w+']); ``` ## 全局变量规则 ```php // 设置name变量规则(采用正则定义) Route::pattern('name', '\w+'); // 支持批量添加 Route::pattern([ 'name' => '\w+', 'id' => '\d+', ]); ``` ## 组合变量规则 ```php Route::get('item-<name>-<id>', 'product/detail') ->pattern(['name' => '\w+', 'id' => '\d+']); Route::get('item<name><id>', 'product/detail') ->pattern(['name' => '[a-zA-Z]+', 'id' => '\d+']); Route::get('item@<name>-<id>', 'product/detail') ->pattern(['name' => '\w+', 'id' => '\d+']); //可选变量 Route::get('item-<name><id?>', 'product/detail') ->pattern(['name' => '[a-zA-Z]+', 'id' => '\d+']); //>V5.1.6+ Route::get('item/:name-:id', 'product/detail') ->pattern(['name' => '\w+', 'id' => '\d+']); ``` ## 动态路由 ```php Route::get('hello/:name', 'index/:name/hello'); Route::get('item-<name>-<id>', 'product_:name/detail') ->pattern(['name' => '\w+', 'id' => '\d+']); ``` # 路由地址 ## 路由到模块/控制器/操作 **[模块/控制器/]操作?参数1=值1&参数2=值2...** ```php // 路由到默认或者绑定模块 Route::get('blog/:id','blog/read'); // 路由到index模块 Route::get('blog/:id','index/blog/read'); Route::get('blog/index/:id','blog/index/read'); ``` Blog类 ```php <?php namespace app\index\controller; class Blog { public function read($id) { return 'read:' . $id; } } ``` 路由地址中支持多级控制器 ```php //表示路由到index/controller/group/Blog Route::get('blog/:id','index/group.blog/read'); ``` url地址 ```url http://127.0.0.1:10004/tp/public/index.php/blog/index/233 ``` 还可以支持路由到动态的模块、控制器或者操作,例如: ```php // action变量的值作为操作方法传入 // http://127.0.0.1:10004/tp/public/index.php/read/blog/1 Route::get(':action/blog/:id', 'blog/index/:action'); // 变量传入index模块的控制器和操作方法 // http://127.0.0.1:10004/tp/public/index.php/index/read/2 Route::get(':c/:a', 'index/:c/:a'); ``` ### 额外参数 ```php Route::get('blog/:id','blog/read?status=1&app_id=5'); ``` ## 路由到操作方法 >这种方式看起来似乎和第一种是一样的,本质的区别是直接执行某个控制器类的方法,而不需要去解析 模块/控制器/操作这些,同时也不会去初始化模块(因此**不会调用模块的初始化方法**) ```php Route::get('blog/:id','@index/blog/read'); ``` ## 路由到类的方法 ```php // 类方法 Route::get('blog/:id','\app\index\service\Blog@read'); // 静态方法 Route::get('blog/:id','\app\index\service\Blog::read'); // 额外参数 Route::get('blog/:id','\app\index\service\Blog::read?status=1'); ``` ## 路由到重定向地址 >重定向的外部地址必须以“/”或者http开头的地址。 如果路由地址以“/”或者“http”开头则会认为是一个重定向地址或者外部地址 ```php // 外部地址 301 重定向 Route::get('blog/:id','/blog/read/id/:id'); // 内部地址 Route::get('blog/:id','blog/read'); ``` ## 路由到模板 (V5.1.3) [X] ```php //表示该路由会渲染 index模块下面的view/hello.html模板文件输出。 Route::view('hello/:name','index@hello'); ``` 模板文件中可以直接输出当前请求的param变量,如果需要增加额外的模板变量,可以使用: ```php Route::view('hello/:name','index@hello',['city'=>'shanghai']); ``` 模板文件 ```html Hello,{$name}--{$city}! ``` 1 Thinkphp笔记(架构) Laradock 的安装部署