• thinkphp学习笔记10—看不懂的路由规则


    路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂。

    1.路由定义

    要使用路由功能需要支持PATH_INFO,PATH_INFO是什么呢?手册中提到“要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能),” , url支持path_info,不是apache要支持path_info么,度娘讲的还算清楚一点,见下文:

    pathinfo
    (PHP 4 >= 4.0.3, PHP 5)
    pathinfo -- 返回文件路径的信息
    说明
    array pathinfo ( string path [, int options] )
    pathinfo() 返回一个关联数组包含有 path 的信息。包括以下的数组单元:dirname,basename 和 extension。
    可以通过参数 options 指定要返回哪些单元。它们包括:PATHINFO_DIRNAME,PATHINFO_BASENAME 和 PATHINFO_EXTENSION。默认是返回全部的单元。
    例子 1. pathinfo() 例子
    <?php
    $path_parts = pathinfo("/www/htdocs/index.html");
    echo $path_parts["dirname"] . " ";
    echo $path_parts["basename"] . " ";
    echo $path_parts["extension"] . " ";
    ?>
    上例将输出:
    /www/htdocs
    index.html
    html

    我去写这段的时候在我的机器上没有输出任何内容,后来我在php安装目录下找到php.ini开启了cgi.fix_pathinfo=1,然后确实能够输出上面的内容。

    但是这只是讲了一个函数的用法,就是pathinfo这个函数会返回一个数组,里面有三个元素分别是

    dirname:我的理解,服务器名称加上路径,
    basename:访问的文件名,
    extension:文件的扩展名

    服务器支持后还需要在配置文件中打开相应的配置,

    // 开启路由
    'URL_ROUTER_ON'   => true, 

    这个配置在ThinkPHPConfconvention.php文件中也有定义,不过可以在模块的配置文件中覆盖它。然后就是定义路由规则了,路由的匹配是按照先到先得的顺序来进行的,在第一次匹配成功之后就不会再次匹配了,而是访问这个路由中的控制器和方法,并传入参数,得到结果。

    路由规则定义的格式是:'路由表达式'=>'路由地址和传入参数' 或 array('路由表达式','路由地址','传入参数')

    路由表达式包含规则路由和正则路由

    表达式      示例
    正则表达式 /^blog/(d+)$/
    规则表达式 blog/:id

    路由地址表示当前路由表达式需要路由到的地址,包含内部地址和外部地址,并允许隐式传入url里面没有的参数,允许使用字符串或者数组的方式定义,特殊情况下可采用闭包函数定义路由功能,支持下面6中方式定义, 

    定义方式定义格式
    方式1:路由到内部地址(字符串) '[分组/模块/操作]?额外参数1=值1&额外参数2=值2...'
    方式2:路由到内部地址(数组)参数采用字符串方式 array('[分组/模块/操作]','额外参数1=值1&额外参数2=值2...')
    方式3:路由到内部地址(数组)参数采用数组方式 array('[分组/模块/操作]',array('额外参数1'=>'值1','额外参数2'=>'值2'...)[,路由参数])
    方式4:路由到外部地址(字符串)301重定向 '外部地址'
    方式5:路由到外部地址(数组)可以指定重定向代码 array('外部地址','重定向代码'[,路由参数])
    方式6:闭包函数 function($name){ echo 'Hello,'.$name;}

    完全不懂啊!内部地址,外部地址?什么概念呢局域网中的地址吗?192.168.0.1这样的?大学学的都忘记了,百度了一下,貌似这样的,有三类内部地址,用来连接局域网中的设备,包含打印机等?

    路由以http或者/开头的话会被认为是一个外部地址或者重定向地址,例如

    'blog/:id'=>'/blog/read/id/:1' 采用301重定向的方式路由跳转,这种方式的好处是url可以比较随意,包括在url里面传入更多的非标准格式参数,擦完全不懂的,非标准格式参数为何物?太tm专业了。

    'blog/:id'=>'blog/read':只支持模块和操作地址,例如我们希望avatar/123重定向到/member/avatar/id/123_small只能使用'avatar/:id'=>'/member/avatar/id/:1_small' 貌似:id代表一个参数,参数名字是id。路由地址采用重定向地址的话,如果要引用动态变量,也是采用 :1、:2 的方式。采用重定向到外部地址通常对网站改版后的URL迁移过程非常有用,例如:'blog/:id'=>'http://blog.thinkphp.cn/read/:1' 表示当前网站(可能是http://thinkphp.cn)的 blog/123 地址会直接重定向到 http://blog.thinkphp.cn/read/123

    2.规则路由

    规则表达式包含静态地址和动态地址,或者是两种地址的结合,如下:

    "my" => "Member/myinfo",    //静态路由地址
    "blog/:id" => "blog/read",     //静态地址和动态地址结合,
    "new/:year/:month/:day" => "news/read", //静态地址和动态地址的结合
    ":user/:blog_id"  =>  "Blog/read",  //全动态地址

    参数里面以“:”开头的就是动态参数,自动对应一个get参数,例如":id"表示此处可以使用$_GET['id']来获取参数,而":year",":month",":day"分别对应$_GET['year'],$_GET['month'],$_GET['day']来获取。

    数字约束:支持对变量类型检测,目前仅仅支持对数字类型的约束定义,例如'blog/:idd'=>'blog/read',表示只匹配数字参数,
    函数支持:可以支持对路由变量的函数过滤,例如'blog/:idd|md5' => 'blog/read',表示对匹配到的变量进行md5处理,实际传入read操作方法的$_GET['id'],其实是md5($_GET['id']),不支持对变量使用多次函数处理和函数额外参数处理。

      

  • 相关阅读:
    vue 下载模板
    vue 使用XLSX 导入表格
    el-select 同时传递多个参数 id value.
    关于前端node 内存溢出
    js判断输入是否含有空格
    python中的内置函数总结
    Python的数据类型和常用方法大全
    简单认识python的数据类型和语法
    Part1.1 、RabbitMQ 操作使用
    Part1.2 、RabbitMQ -- Publish/Subscribe 【发布和订阅】
  • 原文地址:https://www.cnblogs.com/tylerdonet/p/3861725.html
Copyright © 2020-2023  润新知