zoukankan      html  css  js  c++  java
  • 3.Thinkphp的路由

    路由简介

    什么是路由?

    将用户的请求按照事先规划的方案提交给指定的 控制器 和 方法来进行处理。

    Thinkphp框架提供了两种路由规则

    Ø pathinfo模式

    pathinfo 方式路由
    pathinfo:即全路径的访问控制器方法,如:域名/模块/控制器/方法
    
    pathinfo 方式路由示例
    // index模块下index控制器index方法
    tp5.com/index/index/index
    

    Ø 自定义路由规则【推荐】

    进而可以让URL更规范以及优雅,提高网站的安全和网站URL访问的友好度。

    Route类注册使用thinkfacadeRoute类静态调用 thinkRoute.php

    注:ThinkPHP5.1的路由定义更加对象化,并且默认开启路由(不能关闭),如果一个URL没有定义路由,则采用默认的PATH_INFO 模式访问URL。

    隐藏index.php文件

    为什么要配置隐藏index.php

    Thinkphp在pubilc文件夹下的.htaccess文件中已经默认配置了重写

    .htaccess文件内容如下

    <IfModule mod_rewrite.c>
      Options +FollowSymlinks -Multiviews
      RewriteEngine On
    
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
      #如果重写不生效是可以将RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 这行注释,使用下面这个试试,这个表示兼容模式
      #RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
    </IfModule>
    
    

    那我们访问的路由应该可以写http://www.tp5.com/index/index/,用浏览器访问会发现访问错误404,说明重写失败

    image-20200520221304348

    那我们应该如何访问呢?应该使用这个http://www.tp5.com/index.php/index/index/访问

    image-20200520221448332

    细心的你会发现中间多了一层index.php,那么我们可以将这个给隐藏吗,也就是让重写生效?答案是可以的

    配置重写,隐藏index.php文件

    1.打开apache重写模块

    找到apachehttpd.conf文件搜索rewriteLoadModule rewrite_module modules/mod_rewrite.so前面的#号去掉

    image-20200520222407575

    2.配置虚拟主机中允许重写

    找到虚拟主机配置文件按下图方式设置

    image-20200520223219305

    在入口文件中要有.htaccess文件

    image-20200520224419176

    重启apache服务,让配置生效。访问时就可以不用带index.php文件了。

    路由常用配置

    强制路由

    config/app.php配置文件中设置

    'url_route_must'  =>  true,
    注:将开启强制使用路由,这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。
    

    路由缓存

    对于路由规则较多的应用可以大幅提升路由性能(仅部署模式有效)

    'route_check_cache'	=> true,
    注:如果路由定义中,有某个路由规则的路由地址使用了闭包的方式,那么路由缓存将会失效。
    

    完全匹配

    'route_complete_match'   => true,
    

    123

    自定义路由

    路由如何定义

    路由文件的位置:项目目录/routes/route.php文件中进行如下格式的定义

    Route::请求方式('路由表达式',匿名函数);
    或者
    Route::请求方式('路由表达式','[@]模块名/控制器名/方法名'); 
    

    注:给控制器方法设置好了请求的路由规则后,原来的pathinfo请求则失效,请求就会报异常,只能通过自定义路由规则来请求

    例:

    定义一个跟路由并使用匿名函数输出hello world ruote...

    写法如下:

    <?php
    use thinkfacadeRoute;
    
    route::get('/', function (){
        return 'hello world ruote...';
    });
    

    image-20200521152844273

    路由请求类型

    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'); 		// 所有请求都支持的路由规则  框架提供 不推荐
    
    

    例:
    image-20200521154053161

    测试定义好的请求路由规则类型,使用postman软件来测试

    image-20200521154241341

    路由参数

    路由参数分类

    路由参数分为下面两种:

    # 必填参数
    Route::请求方式('路由表达式/:参数',匿名函数);
    # 可选参数
    Route::请求方式('路由表达式/[:参数]',匿名函数);
    

    必填参数的参数必须填,可选参数的参数值可写可不填

    形参名和参数名必须保持一致否则会报错

    必填参数示例:
    Route::get('/dd/:id', function ($id){
        return '你输入的参数值为:'.$id;
    });
    

    运行结果:

    image-20200521155643796

    可选参数示例:
    Route::get('/dd/[:id]', function ($id = 0){
        return '你输入的参数值为:'.$id;
    });
    

    注意:可选参数设置时,如果要获取参数则需要在形参出设置默认值

    运行结果:

    image-20200521161745604

    路由参数类型的限制

    为什么要对路由参数的类型进行限制?因为可以提高效率,官方给出的数据是比不限制的快4倍

    方式一:标量限定

    标量限定时php7提供的,所以要想使用必须保证本地环境是php7以上

    Route::get('/dd/:id', function (int $id){
        return '你输入的参数值为:'.$id;
    });
    

    image-20200521163517683

    方式二:正则表达式限定

    例:

    Route::get('/dd/:id', function ($id){
        return '你输入的参数值为:'.$id;
    })->pattern(['id' => 'd+']);
    

    image-20200521164227364

    传入多个参数并限定

    例:

    Route::get('/dd/:id/:name', function ($id,$name){
        return '你输入的参数值为:'.$id.$name;
    
    })->pattern(['id' => 'd+']);
    

    运行结果

    image-20200521164824708

    路由分组基本使用

    路由分组功能允许把相同前缀的路由定义合并分组,这样可以简化路由定义,并且提高路由匹配的效率,不必每次都去遍历完整的路由规则(尤其是开启了路由延迟解析后性能更佳)。

    使用Route类的group方法进行注册,给分组路由定义一些公用的路由设置参数,使用规范如下:

    Route::group('分组名(字符串)或者分组路由参数(数组)','分组路由规则(数组或者闭包)');

    格式示例:

    Route::group('blog', function () {
        Route::get(':id', 'read');
        Route::post(':id', 'update');
        Route::delete(':id', 'delete');
    })->pattern(['id' => 'd+']);
    
    
    # 分组的嵌套
    Route::group(['method'=>'get'], function () {
        Route::group('blog',function(){
                Route::get(':id', 'read');
                Route::post(':id', 'update');
                Route::delete(':id', 'delete');
        });
    })->pattern(['id' => 'd+']);
    
    

    单个分组示例

    //路由分组
    Route::group('bolg',function (){
        Route::get('index',function (){
           return 'index';
        });
    });
    

    image-20200521172504039

    分组嵌套示例

    /**
     * admin/login
     * admin/welcome
     */
    Route::group(['method'=>'get'], function () {
        Route::group('admin',function(){
            Route::get('login',function (){
                return 'route long';
            });
            Route::get('welcome',function (){
                return 'route welcome';
            });
            Route::post('login',function (){
                return 'route long';
            });
        });
    })->pattern(['id' => 'd+']);
    

    image-20200521172709036

    查看已定义的路由列表

    php think route:list   #查看已定义的路由列表
    

    路由分模块(文件)

    在公共函数文件中定义找到route文件夹的路径函数

    //找到route文件夹
    function route_path(){
        return dirname(__DIR__).DIRECTORY_SEPARATOR.'route';
    }
    

    route文件夹下创建文件夹(模块名),写入路由规则

    例:

    /route/admin/admin.php

    <?php
    use 	hinkfacadeRoute;
    Route::group('admin', function (){
        Route::get('login', '@admin/login/index')->name('login');
        Route::post('loginSubmi', '@admin/login/loginSubmi')->name('loginSubmi');
    });
    

    route文件夹根目录的route.php,里引入该文件

    include route_path().'/admin/admin.php';
    

    如图

    image-20200530164132022

  • 相关阅读:
    Cannot find module 'express'
    txt简单写入
    URLRewriter 伪静态配置Demo
    利用css的sticky特性实现固定首列其他列滚动
    金数据表单接口请求(php)
    Android应用app数据请求捕捉三步走
    go语言模块开发概念与cron定时事务模块的使用
    万维网的发明
    UEditor扩展又拍云图片存储功能实践
    Html5+移动端小应用分享(得见)
  • 原文地址:https://www.cnblogs.com/makalochen/p/12932167.html
Copyright © 2011-2022 走看看