# URL访问 * * * * * Thinkphp采用单一入口模式访问应用,访问的URL标准: ~~~ http://domainName/index.php/模块/控制器/操作 ~~~ 如果你的控制器是驼峰的,如HelloWord控制器( `application/index/controler/helloWorld.php`) ~~~ <?php namespace app\index\controller; class HelloWorld { public function index($name = 'World') { return 'Hello,' . $name . '!'; } } ~~~ 正确的访问方式是: ~~~ http://domainName/index.php/index/hello_word/index ~~~ 如果想严格区分大小写,修改配置以文件 ~~~ //关闭URL自动转换(支持驼峰访问控制器) 'url_convert'=false, ~~~ ## 多个参数传入 ~~~ http://domainName/index.php/index/index/hello/name/thinkphp/city/shanghai ~~~ ## 定义路由 ~~~ return [ //添加路由规则 'hello/:name'=>'index/index/hello', ] ~~~ >[info] 还可以使用动态设置路由规则 >[warning]注意:如果添加了路由规则,原始的URL访问地址就失效,不能访问 >[danger]路由模块配置不支持在模块配置文件中使用 >[success] 路由规则很重要 ### 1.完整匹配 路由规则以$结尾时候,标识当前规则需要完全匹配 ~~~ return[ //路由参数name为可选 'hello/[:name]$'=>'index/hello', ] ~~~ 例子: ~~~ http://domainName/hello // 正确匹配 http://domainName/hello/thinkphp // 正确匹配 http://domainName/hello/thinkphp/val/value // 不会匹配 ~~~ ### 2.闭包路由 >[success]闭包路由就是在路由规则中定义函数,为某些特殊场景定义路由规则 ~~~ return [ // 定义闭包 'hello/[:name]' => function ($name) { return 'Hello,' . $name . '!'; }, ]; ~~~ 或者动态设置 ~~~ use think\Route; Route::rule('hello/:name', function ($name) { return 'Hello,' . $name . '!'; }); ~~~ ### 3.设置URL分隔符 如果需要改变URL地址中pathinfo参数分割符,需要在config.php中设置 ~~~ //设置path分隔符 'pathinfo_depr'=>'-', ~~~ 我们就可以访问带有参数的地址: ~~~ http://domainName/hello-thinkphp ~~~ ### 4.路由参数 我们还可以约束路由规则的请求类型和URL后缀等条件。 ~~~ return [ //定义路由请求类型和后缀 'hello/[:name]'=>['index/hello',['method=>'get','ext'=>'html'']], ]; ~~~ ### 5.变量规则 ~~~ 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+']], ]; ~~~ ### 6.路由分组 ~~~ 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+']], ], ]; ~~~ >[warning] 如果定义了全局规则,又定义了局部规则,则当前的局部规则会被全局规则覆盖 ### 7.复杂路由 ~~~ 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', ]; ~~~ ### 8.生成URL地址 定义路由规则之后,我们可以通过Url类来方便的生成实际的URL地址(路由地址),针对上面的路由规则,我们可以用下面的方式生成URL地址。 ~~~ // 输出 blog/thinkphp Url::build('blog/read', 'name=thinkphp'); Url::build('blog/read', ['name' => 'thinkphp']); // 输出 blog/5 Url::build('blog/get', 'id=5'); Url::build('blog/get', ['id' => 5]); // 输出 blog/2015/05 Url::build('blog/archive', 'year=2015&month=05'); Url::build('blog/archive', ['year' => '2015', 'month' => '05']); ~~~ 我们还可以使用系统提供的助手函数url来简化 ~~~ url('blog/read', 'name=thinkphp'); // 等效于 Url::build('blog/read', 'name=thinkphp'); ~~~ 通常在模板文件中输出的话,可以使用助手函数,例如: ~~~ {:url('blog/read', 'name=thinkphp')} ~~~