精华内容
下载资源
问答
  • 本扩展包是tp5的rbac包,使用了部分tp5的特性实现了关系型数据库中特殊数据结构的处理。 安装方法先安装composer如果不知道怎么安装使用composer请自行百度。 打开命令行工具切换到你的tp5项目根目录composer ...

    # 点击进入新版本使用教程https://marswill.blog.csdn.net/article/details/89378405

    tp5-rbac

    本扩展包是tp5的rbac包,使用了部分tp5的特性实现了关系型数据库中特殊数据结构的处理。

    ##安装方法
    先安装composer如果不知道怎么安装使用composer请自行百度。
    打开命令行工具切换到你的tp5项目根目录

    composer require gmars/tp5-rbac
    

    如果该方法报错请按照以下方式操作:

    1. 打开项目根目录下的composer.json
    2. 在require中添加"gmars/tp5-rbac": “dev-master”
    3. 运行composer update

    添加后composer.json应该有这样的部分:

        "require": {
            "php": ">=5.4.0",
            "topthink/framework": "^5.0",
            "gmars/tp5-rbac": "dev-master"
        },
    

    ##数据迁移
    在使用本插件之前需要有rbac锁需要的数据库。在迁移之前如果你的数据库中已有user数据表那么请你备份自己的user数据表后删除。

    在你的项目的某个config.php中加入如下配置:

    'migration' => [
        'path' => ROOT_PATH .'vendor/gmars/tp5-rbac/'
    ],
    

    然后把命令行切换到你的项目根目录Windows是cmd运行如下命令

    php think migrate:run
    

    如果迁移运行成功会在你的数据库中生成如下几张表:

    user              用户表
    user_role         用户角色对应表
    role              角色表
    role_permission   角色权限对应表
    permission        角色表
    

    ###使用该插件–RBAC的管理

    在一个系统中RBAC是基于角色的权限控制。作为开发人员需要明白这是两个不同的过程。第一个就是构建系统的RBAC结构,包括添加权限,角色,用户,用户角色对应关系,角色权限对应关系等。

    在此先说明RBAC管理:

    1.添加用户

    这一步是在用户注册时要做的一步,就是讲注册的用户添加到user表中。

    $rbacObj = new Rbac();
    $data = ['user_name' => 'zhangsan', 'status' => 1, 'password' => md5('zhangsan')];
    $rbacObj->createUser($data);
    

    创建用户时传入唯一一个参数必须是数组。数组中应该包含用户表需要的数据。如果出现其他非user表的字段则会抛出异常。
    该方法返回的结果为false或者Exception或者新添加用户的id

    2.添加权限

    这一步是构建系统的权限。一般我们是以请求的路由为权限的识别标志。在该插件中使用path字段。

    例如我们的系统中有商品列表这样的一个操作需要授权。

    其路由为 /index/goods/list

    添加路由如下:

    $rbacObj = new Rbac();
    $data = [
        'name' => '商品列表',
        'status' => 1,
        'description' => '查看商品的所有列表',
        'path' => '/index/goods/list',
        'create_time' => time()
    ];
    $rbacObj->createPermission($data);
    

    3.添加角色

    在RBAC的角色中角色是有父子关系的,也就是说所添加的角色可以是另一个角色的子角色。

    $rbacObj = new Rbac();
    $data = [
        'name' => '商品管理员',
        'status' => 1,
        'description' => '商品管理员负责商品的查看修改删除等操作',
        'sort_num' => 10,
        'parent_id' => 1
    ];
    $rbacObj->createRole($data);
    

    需要注意的是在data中有个字段为parent_id这个字段标识了所要添加的角色的父角色。如果留为空则便是添加的父角色。

    4.为用户分配角色

    当然一个用户可以有多个角色。一般是使用多选框或其他形式选择后以数组的方式传入的。

    例如:

    $rbacObj = new Rbac();
    $rbacObj->assignUserRole(1, [1, 2]);
    

    assignUserRole($userId, array $roleArray = [])

    该方法的第一个参数为用户id第二个参数是一个一位数组,其元素为角色的id

    5.为角色分配权限

    例如:

    $rbacObj = new Rbac();
    $rbacObj->assignRolePermission(1, [1, 2]);
    

    将id分别为1,2的权限分配给id为1的角色

    6.删除角色

    删除角色的同时必须删除角色和权限的对应数据

    $rbacObj = new Rbac();
    $rbacObj->delRole(1);
    

    其中需要传入的是角色id

    7.将一个角色移到另一个角色下

    以上已经说明了角色是有父子关系的那么肯定能够移动其位置

    $rbacObj = new Rbac();
    $rbacObj->moveRole(1,3);
    

    该例子是将id为1的角色移动到id为3的角色下作为子角色。

    还有其他修改删除等方法的文档日后再补全,功能是有的

    ###使用该插件–RBAC权限验证

    ####登录后获取权限列表
    如果自己写权限验证则请忽略这一步,如果要使用rbac插件来验证权限则必须要这样做。

    在登录成功后做如下操作:

    $rbacObj = new Rbac();
    $rbacObj->cachePermission(1);
    

    这个方法是查询id为1的用户的所有权限并且以path索引后存入cache

    ####请求时的权限验证

    当然对于每一个方法都要进行权限验证时我们一般是在某一个父类中定义一个方法进行权限验证,验证如下:

    $rbacObj = new Rbac();
    $rbacObj->can('/index/goods/list');
    

    该方法是验证当前用户有没有操作/index/goods/list的权限,如果有则返回true如果无则返回false

    其中can的参数可以使用tp5的特性获取。

    展开全文
  • tp5的主要目录:├─application 应用目录(存放自定义模块,如前台,后台的模块) ├─extend 扩展类库目录(可定义) ├─public 网站对外访问目录(存放公用的文件例如css,js等文件) ├─runtime 运行时目录...
      tp5的主要目录:
    ├─application     应用目录(存放自定义模块,如前台,后台的模块)
    ├─extend          扩展类库目录(可定义)
    ├─public          网站对外访问目录(存放公用的文件例如css,js等文件)
    ├─runtime         运行时目录(可定义)
    ├─vendor          第三方类库目录(Composer)
    ├─thinkphp        框架核心目录
    ├─build.php       自动生成定义文件(可以用bulid.php文件生成application目录下的模块)
    ├─composer.json   Composer定义文件
    ├─LICENSE.txt     授权说明文件
    ├─README.md       README 文件
    ├─think           命令行工具入口

     默认应用目录的详情:

    ├─application           应用目录(可设置)
    │  ├─admin              模块目录(可创建其他模块目录)
    │  │  ├─config.php      模块配置文件
    │  │  ├─common.php      模块公共文件
    │  │  ├─controller      控制器目录
    |   |   |—validate 存放验证机制(对后台接收到的数据进行校验,tp5新增的机制)
    │  │  ├─model           模型目录
    │  │  └─view            视图目录
    
    │ ││ ├─command.php 命令行工具配置文件
    │ ├─common.php 应用公共文件
    │ ├─config.php 应用配置文件
    │ ├─tags.php 应用行为扩展定义文件
    │ ├─database.php 数据库配置文件
    │ └─route.php 路由配置文件

    
    其中validate中存放的对数据的验证规则:
    

    <?php
    namespace app\admin\validate;
    use think\Validate;
    class Category extends Validate {
       //对接收到的数据进行校验
        protected  $rule = [
            ['name', 'require|max:20', '用户名不能为空|用户名不能超过20个字符'],
            ['parent_id','number'],
            ['id', 'number'],
            ['status', 'number|in:-1,0,1','状态码必须是数字|状态范围不合法'],
            ['listorder', 'number'],
        ];
    
        /**场景设置**/
        protected  $scene = [
            'add' => ['name', 'parent_id', 'id'],// 添加
            'listorder' => ['id', 'listorder'], //排序
            'status' => ['id', 'status'],
        ];
    }

    在控制器调用如下:

           $validate=Validate('Category');
            if(!$validate->check($data)){
                $this->error($validate->getError());
            }
    核心的目录详情:
    ├─thinkphp 框架系统目录
    │  ├─lang               语言包目录
    │  ├─library            框架核心类库目录
    │  │  ├─think           think 类库包目录
    │  │  └─traits          系统 traits 目录
    │  ├─tpl                系统模板目录
    │  │
    │  ├─.htaccess          用于 apache 的重写
    │  ├─.travis.yml        CI 定义文件
    │  ├─base.php           框架基础文件
    │  ├─composer.json      composer 定义文件
    │  ├─console.php        控制台入口文件
    │  ├─convention.php     惯例配置文件
    │  ├─helper.php         助手函数文件(可选)
    │  ├─LICENSE.txt        授权说明文件
    │  ├─phpunit.xml        单元测试配置文件
    │  ├─README.md          README 文件
    │  └─start.php          框架引导文件

    tp5主要有以下的一些新特性:

       1.tp5的访问路径做了小的改动,tp3的访问路径一般是:http://localhost/thinkphp/index.php?m=Admin&c=Login&a=index 。tp5改动后的访问路径是:http://localhost/thinkphp5/public/index.php,tp5也可以通过端口号访问。

     2.自定以模块:

        在application模块下创建自定义模块有两种方式:第一种通过手动创建自定义模块,直接复制其他模块,改名即可。第二种方法是通过build.php文件创建自定义模块,如admin模块:
        在application模块下创建build.php文件,然后输入以下内容,然后在根目录下执行php think build 就可以创建新的自定义模块了。

    return[
      'admin' => [
    		'__dir__' => ['controller','view',validate],
    		'controller' => ['Index'],
    		'view' => ['index/index'],
                    'validate'=>[Index],
    	],
    ];

    3.tp5的分页机制:

     在model层直接调用paginate方法即可,然后在页面中调用render方法,代码如下:

    后台代码:

    public function test()
    	{
    	$data = [
                'id' => 1,
            ];
    
            $order = [
                'id' => 'desc',
            ];
    
            return $this->where($data)
                             ->order($order)
                              ->paginate();
    	}

    前台页面代码:

    <div>{$category->render()}</div>

    tp5的分页机制默认显示15条数据你,也可自定义显示条数,在application目录下的config.php文件中可自定义。

    tp5还有许多新的特性,可参考tp5使用文档:https://www.kancloud.cn/manual/thinkphp5/118003







    展开全文
  • 最新基于TP5通用后台Auth权限管理系统,对于学习TP5的同学,能尽快的熟悉和上手了解TP5的特性
  • tp5属性不存在_tp5

    2020-12-29 06:38:31
    ThinkPHP 5.0ThinkPHP5在保持快速开发和大道至简核心理念不变同时,PHP版本要求提升到5.4,对已有CBD模式做了更深强化,优化核心,减少依赖,基于全新架构思想和命名空间实现,是ThinkPHP突破原有框架思路...

    ThinkPHP 5.0

    ThinkPHP5在保持快速开发和大道至简的核心理念不变的同时,PHP版本要求提升到5.4,对已有的CBD模式做了更深的强化,优化核心,减少依赖,基于全新的架构思想和命名空间实现,是ThinkPHP突破原有框架思路的颠覆之作,其主要特性包括:

    基于命名空间和众多PHP新特性

    核心功能组件化

    强化路由功能

    更灵活的控制器

    重构的模型和数据库类

    配置文件可分离

    重写的自动验证和完成

    简化扩展机制

    API支持完善

    改进的Log类

    命令行访问支持

    REST支持

    引导文件支持

    方便的自动生成定义

    真正惰性加载

    分布式环境支持

    更多的社交类库

    ThinkPHP5的运行环境要求PHP5.4以上。

    目录结构

    初始的目录结构如下:

    www WEB部署目录(或者子目录)

    ├─application 应用目录

    │ ├─common 公共模块目录(可以更改)

    │ ├─module_name 模块目录

    │ │ ├─config.php 模块配置文件

    │ │ ├─common.php 模块函数文件

    │ │ ├─controller 控制器目录

    │ │ ├─model 模型目录

    │ │ ├─view 视图目录

    │ │ └─ ... 更多类库目录

    │ │

    │ ├─command.php 命令行工具配置文件

    │ ├─common.php 公共函数文件

    │ ├─config.php 公共配置文件

    │ ├─route.php 路由配置文件

    │ ├─tags.php 应用行为扩展定义文件

    │ └─database.php 数据库配置文件

    ├─public WEB目录(对外访问目录)

    │ ├─index.php 入口文件

    │ ├─router.php 快速测试文件

    │ └─.htaccess 用于apache的重写

    ├─thinkphp 框架系统目录

    │ ├─lang 语言文件目录

    │ ├─library 框架类库目录

    │ │ ├─think Think类库包目录

    │ │ └─traits 系统Trait目录

    │ │

    │ ├─tpl 系统模板目录

    │ ├─base.php 基础定义文件

    │ ├─console.php 控制台入口文件

    │ ├─convention.php 框架惯例配置文件

    │ ├─helper.php 助手函数文件

    │ ├─phpunit.xml phpunit配置文件

    │ └─start.php 框架入口文件

    ├─extend 扩展类库目录

    ├─runtime 应用的运行时目录(可写,可定制)

    ├─vendor 第三方类库目录(Composer依赖库)

    ├─build.php 自动生成定义文件(参考)

    ├─composer.json composer 定义文件

    ├─LICENSE.txt 授权说明文件

    ├─README.md README 文件

    ├─think 命令行入口文件

    router.php用于php自带webserver支持,可用于快速测试

    切换到public目录后,启动命令:php -S localhost:8888 router.php

    上面的目录结构和名称是可以改变的,这取决于你的入口文件和配置参数。

    命名规范

    ThinkPHP5遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范:

    目录和文件

    目录不强制规范,驼峰和小写+下划线模式均支持;

    类库、函数文件统一以.php为后缀;

    类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;

    类名和类文件名保持一致,统一采用驼峰法命名(首字母大写);

    函数和类、属性命名

    类的命名采用驼峰法,并且首字母大写,例如 User、UserType,默认不需要添加后缀,例如UserController应该直接命名为User;

    函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip;

    方法的命名使用驼峰法,并且首字母小写,例如 getUserName;

    属性的命名使用驼峰法,并且首字母小写,例如 tableName、instance;

    以双下划线“__”打头的函数或方法作为魔法方法,例如 __call 和 __autoload;

    常量和配置

    常量以大写字母和下划线命名,例如 APP_PATH和 THINK_PATH;

    配置参数以小写字母和下划线命名,例如 url_route_on 和url_convert;

    数据表和字段

    数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段,不建议使用驼峰和中文作为数据表字段命名。

    参与开发

    版权信息

    ThinkPHP遵循Apache2开源协议发布,并提供免费使用。

    本项目包含的第三方源码和二进制文件之版权信息另行标注。

    版权所有Copyright © 2006-2017 by ThinkPHP (http://thinkphp.cn)

    All rights reserved。

    ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。

    展开全文
  • tp5的路由

    2019-09-27 02:42:12
    路由模式:普通、强制和混合 ...关闭路由后普通模式任然可以通过操作方法参数绑定、控制器和空操作等特性实现url地址简化 强制模式: //配置文件如下配置 'url_route_on' => true...

    路由模式:普通、强制和混合

    普通模式:

    //配置文件关闭路由,完全使用默认的PATH_INFO方式URL
    'url_route_on'  =>  false,

    关闭路由后的普通模式任然可以通过操作方法的参数绑定、控制器和空操作等特性实现url地址的简化

    强制模式:

    //配置文件如下配置
    'url_route_on'          =>  true,
    'url_route_must'        =>  true,
    
    //这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。
    
    //首页的路由规则采用/定义即可,例如下面把网站首页路由输出Hello,world!
    Route::get('/',function(){
        return 'Hello,world!';
    });

     

    混合模式:

    //开启路由,并使用路由定义+默认PATH_INFO方式的混合
    //配置如下
    'url_route_on'  =>  true,
    'url_route_must'=>  false,
    //该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的PATH_INFO模式访问URL

    动态注册路由配置两种方式

    由于检测机制问题,动态注册的性能比路由配置要高一些,尤其是多种请求类型混合定义的时候。

    动态注册:

    路由定义采用\think\Route类的rule方法注册,通常是在应用的路由配置文件application/route.php进行注册,格式是

    Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
    请求类型不指定的话默认为任何请求类型包含(GET、POST、PUT、DELETE、*表示任何其他请求)
    单个注册:
    Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
    批量注册:
    Route
    ::rule( [ '路由规则1'=>'路由地址和参数', '路由规则2'=>['路由地址和参数','匹配参数(数组)','变量规则(数组)'] ], '', '请求类型', '匹配参数(数组)', '变量规则' ); Route::rule( [ 'new/:id' => 'News/read', 'blog/:id' => ['Blog/update',['ext'=>'shtml'],['id'=>'\d{4}'] ], ], '', 'GET', ['ext'=>'html'], ['id'=>'\d+'] );


    路由地址:
    // 路由到默认或者绑定模块
    'blog/:id'=>'blog/read',
    // 路由到index模块
    'blog/:id'=>'index/blog/read',
    //多级控制
    'blog/:id'=>'index/group.blog/read',//路由到index/controller/group/Blog
     

     

    Route::rule(
        'theme/:id/[:name]',
        'home/Goods/theme',
        'GET',
        [
            'method'=>'POST|GET|PUT',//请求类型检测
            'ext'=>'shtml|html|php',//检测是shtml|html|php这三个后缀的请求就通过
            'deny_ext'=>'jpg|png|gif',//URL禁止后缀检测,这里禁止检测jpg|png|gif者三个后缀
            'domain'=>'news.thinkphp.cn',//子域名检测则直接news就行'domain'=>'news']
            'https'=>true,//检测是否https请求
            'before_behavior'=>'\app\index\behavior\UserCheck',//前置行为(检测)
            'after_behavior'=>'\app\index\behavior\ReadInfo',//后置行为(执行)
            'callback'=>'my_check_fun',//自定义检测方法
            'merge_extra_vars'=>true,//合并额外参数
            'cache'=>3600,//请求缓存V5.0.1+
            'bind_model'=>['User','name'],//绑定模型V5.0.1+
            'param_depr'=>'',//路由参数分隔符V5.0.2+
            'ajax'=>true,//V5.0.2+
            'pjax'=>true,//V5.0.2+
    
    
        ],
        ['name'=>'\w+','id'=>'\d+']
    );

     

     

    规则表达式

    通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:

    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'); // 全动态地址

    当控制器文件不再controler文件夹下而是在controller子文件夹下时我们定义路由地址格式为[子文件名.  控制器名]

    如:

    //controller/v1/Banner.php  访问为:http://www.localhost/api/v1/banner/1 
    Route::get("api/v1/banner/:id","api/v1.Banner/getBanner");
    
    //下面是动态调用(如不同版本)
    Route::get("api/:version/banner/:id","api/:version.Banner/getBanner");
    //当前新品
    Route::get("api/:version/product/recent","api/:version.Product/getRecent");

     

    ThinkPHP5.0的路由规则定义是从根目录开始,而不是基于模块名的。

    application/route.php注册   然后访问变成http://serverName/new/5

    use think\Route;
    // 注册路由到index模块的News控制器的read操作
    Route::rule('new/:id','index/News/read');

    不同的请求类型定义路由规则的简化方法:请求类型参数必须大写

    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'); // 所有请求都支持的路由规则
    //如果要定义get和post请求支持的路由规则,也可以用:
    Route::rule('new/:id','News/read','GET|POST');

    参数可选定义

    Route::get('blog/:year/[:month]','Blog/archive'); //变量用 [ ] 包含起来后就表示该变量是路由匹配的可选变量
    
    下面的URL访问地址都可以被正确的路由匹配:
    http://serverName/index.php/blog/2015
    http://serverName/index.php/blog/2015/12

    路由标志:设置一个唯一的用于url生成的字符

    // 注册路由到index模块的News控制器的read操作
    Route::name('new_read')->rule('new/:id','index/News/read');
    //生成路由地址的时候就可以使用
    url('new_read',['id'=>10]);
    //如果不定义路由标识的话,使用下面的方式生成
    url('index/News/read',['id'=>10]);
    
    V5.1.6+ 版本开始,路由标识的用法调整,原来的用法:
    // 注册路由到index模块的News控制器的read操作
    Route::name('new_read')->rule('new/:id','index/News/read');
    需要改为:
    // 注册路由到index模块的News控制器的read操作
    Route::rule('new/:id','index/News/read')->name('new_read');
    因为后者更符合语义。

     

     

     

     

     

    路由别名:Route::alias('别名','模型/控制器');

    use think\Route;
    Route::alias('home','index/index');
    Route::alias('admin','admin/index');
    或者:
    return [
    
        '__alias__' =>  [
            'home'  =>  'index/index',
           'admin'=> 'admin/index'
        ],
    
    ];

     

    use think\Route;
    // 注册路由到index模块的News控制器的read操作
    Route::rule('show/:id','test/Index/index');//id必须
    Route::rule('show/[:id]','test/Index/index');//id可选
    Route::rule('new/:id','News/update','POST');//第三个参数为空则表示接受所有的请求类型的参数
    //完全匹配
    Route::rule('show/:id$','test/Index/index');//只有http://www.admindemo2.com/show/2才能访问而去掉$的话http://www.admindemo2.com/show/2/3/tom/...也能通过
    //全局完全匹配(开启全局完全匹配后所有的都不用再加$)
    //配置文件添加
    //'route_complete_match'  =>  true,//开启路由定义的全局完全匹配
    //当开启全局完全匹配的时候,如果个别路由不需要使用完整匹配,可以添加路由参数覆盖定义:
    //Route::rule('new/:id','News/read','GET|POST',['complete_match' => false]);
    
    
    
    Route::get('routeget','test/Index/routeGet'); // 定义GET请求路由规则,同Route::rule('routeget','test/Index/routeGet','GET');//只接受get的请求
    Route::get('routeget/:id','test/Index/routeGet'); // 同//Route::rule('routeget/:id','test/Index/routeGet','GET');//只接受get的请求
    //注意: Route::get('routeget','test/Index/routeGet');与Route::get('routeget/:id','test/Index/routeGet');同时定义相当于Route::get('routeget/[:id]]','test/Index/routeGet');文档说明:注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始调用控制器的操作方法,后续规则就不再检测 所以为了避免冲突最好将优先级高的放在最前面(比如单个设置的变量规则和路由规则放前面,全局的放在最后面)
    Route::rule('routepost','test/Index/routePost','POST');//post的请求才能接受
    Route::rule('routepostorget','test/Index/routePostOrGet','POST|GET');//只接受get和post请求,其他一律不接受
    
    
    // 定义new路由命名标识
    Route::rule(['name','routenameflag/:id'],'test/Index/routeNameFlag');
    //http://www.admindemo2.com/routenmeflag/1
    //{:url('name',['id'=>1])}
    Route::rule(['name2','routenameflag2/'],'test/Index/routeNameFlag2');//第二个参数有没有/都无所谓
    //http://www.admindemo2.com/routenmeflag2 or //http://www.admindemo2.com/routenmeflag2/
    //{:url('name2')}
    Route::rule(['name3','routenameflag3/[:id]'],'test/Index/routeNameFlag3');
    //http://www.admindemo2.com/routenmeflag3 or //http://www.admindemo2.com/routenmeflag3/1
    //{:url('name3')} or //{:url('name',['id'=>1])}
    
    
    
    
    //批量注册:
    Route::rule(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
    Route::get(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
    
    /*
    
    Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
    
    Route::rule(
        [
            '路由规则1'=>'路由地址和参数',
            '路由规则2'=>['路由地址和参数','匹配参数(数组)','变量规则(数组)']
        ],
        '',
        '请求类型',
        '匹配参数(数组)',
        '变量规则'
    );
    
    */
    
    Route::rule(
        [
            'new/:id'  =>  'News/read',
            'blog/:id' =>  ['Blog/update',['ext'=>'shtml'],['id'=>'\d{4}']],
            ':action/blog/:id' => 'index/blog/:action',// action变量的值作为操作方法传入
            ':c/:a'=> 'index/:c/:a',// 变量传入index模块的控制器和操作方法    
        ],
        '',
        'GET',
        ['ext'=>'html'],
        ['id'=>'\d+']
    );
    
    //变量规则
    //1、设置单个路由全局的变量规则
    Route::rule('new/:tittle','News/update');
    // 设置tittle变量规则(采用正则定义)
    Route::pattern('name','\w+');
    //2、批量设置路由全局规则
    Route::rule('new/:tittle','News/update');
    Route::rule('banner/:id','home/Goods/banner');
    Route::pattern([
        'tittle'  =>  '\w+',
        'id'    =>  '\d+',
    ]);
    //3、设置局部变量规则,仅在当前路由有效
    Route::get('new/:name','News/read',[],['name'=>'\w+']);
    
    //4、完整URL规则
    Route::get('allurl/:catergory','test/Index/allUrl',[],['__url__'=>'allurl\/[A-Za-z0-9]{1,}$']);//id必须
    
    
    //组合变量
    //http://www.admindemo2.com/item-sb or http://www.admindemo2.com/item-sb555  or http://www.admindemo2.com/item-sb555a
    /*Route::get('item-<name><id?>','test/Index/product',[],['name'=>'\w+','id'=>'\d+']);*/
    // http://www.admindemo2.com/item-sb-555
    Route::get('item-<name>-<id>','test/Index/product',[],['name'=>'\w+','id'=>'\d+']);
    
    
    
    Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
    
    Route::rule(
        'theme/:id/[:name]',
        'home/Goods/theme',//路由地址
        'GET',
        [
            'method'=>'POST|GET|PUT',//请求类型检测
            'ext'=>'shtml|html|php',//检测是shtml|html|php这三个后缀的请求就通过
            'deny_ext'=>'jpg|png|gif',//URL禁止后缀检测,这里禁止检测jpg|png|gif者三个后缀
            'domain'=>'news.thinkphp.cn',//子域名检测则直接news就行'domain'=>'news']
            'https'=>true,//检测是否https请求
            'before_behavior'=>'\app\index\behavior\UserCheck',//前置行为(检测)
            'after_behavior'=>'\app\index\behavior\ReadInfo',//后置行为(执行)
            'callback'=>'my_check_fun',//自定义检测方法
            'merge_extra_vars'=>true,//合并额外参数
            'cache'=>3600,//请求缓存V5.0.1+
            'bind_model'=>['User','name'],//绑定模型V5.0.1+
            'param_depr'=>'',//路由参数分隔符V5.0.2+
            'ajax'=>true,//V5.0.2+
            'pjax'=>true,//V5.0.2+
    
    
        ],
        ['name'=>'\w+','id'=>'\d+']
    );
    
    
    //路由地址
    
    //1、额外参数:
    Route::get('extraparams/:id','test/Index/extraParam?status=1&app_id=5'); 
    // http://www.admindemo2.com/extraparams/2/3  访问
    // Request::instance()->route()能获取到id、status、app_id
    
    //2 路由到模块/控制器   [模块/控制器/]操作?参数1=值1&参数2=值2...
    //2.1 路由到默认或者绑定模块
    Route::rule('blog/:id','index/read');
    //2.2 路由到index模块
    Route::rule('blog/:id','test/index/read');
    
    //2.3、路由到动态的模块、控制器或者操作
    //http://www.admindemo2.com/moviemodel/index/1  访问到的是test/Index/movieModel()
    Route::rule(':action/index/:id','test/Index/:action');
    //http://www.admindemo2.com/moviemodel/lichihua/1  访问到的是test/Index/movieModel()
    Route::rule(':action/lichihua/:id','test/Index/:action');
    
    
    
    
    //4 路由到操作方法  @[模块/控制器/]操作
    //'blog/:id'=>'@index/blog/read',   系统会直接执行 Loader::action('index/blog/read');
    //这种方式看起来似乎和第一种是一样的,本质的区别是直接执行某个控制器类的方法,而不需要去解析 模块/控制器/操作这些,同时也不会去初始化模块,视图的默认模板规则失效,所以这种情况下面,如果使用了视图模板渲染,则必须传入明确的参数
    Route::get('test/:id','@test/Index/dongTest?status=1'); //??
    
    //路由到类的方法     路由地址的格式为(动态方法):\类的命名空间\类名@方法名  或者(静态方法):\类的命名空间\类名::方法名
    
    //可以支持执行任何类的方法,而不仅仅是执行控制器的操作方法
    Route::rule('blog/:id','\app\index\service\Blog@read');//执行的是 \app\index\service\Blog类的read方法
    Route::rule('blog/:id','\app\index\service\Blog::read');
    //V5.0.4+版本开始,支持传入额外的参数作为方法的参数调用(用于参数绑定),例如:
    Route::rule('blog/:id','\app\index\service\Blog::read?status=1');
    
    //路由到重定向地址  以/或者http 开头
    Route::rule('wolichihua/:id','/test/:id');
    //http://www.admindemo2.com/wolichihua/1  访问到了est/Index/dongTest即上面定义的test/:id'
    
    
    
    //资源路由
    //在指向index模块的blog控制器新建index()、create($id)、save、read($id)、eidit($id)、update($id)、delete($id)方法然后动态注册(资源路由会自动注册7个路由规则分别对应这几个方法) 详情参考资源路由
    Route::resource('blog','index/blog');
    //或者路由配置
    return [
        // 定义资源路由
        '__rest__'=>[
            // 指向index模块的blog控制器
            'blog'=>'index/blog',
        ],
        // 定义普通路由
        'hello/:id'=>'index/hello',
    ];
    
    //快捷路由  Route::controller('user','模块/控制器');
    // 给User控制器设置快捷路由  控制器方法为 请求类型+方法名  如getInfo()与postInfo()
    // get http://localhost/user/phone   post http://localhost/user/info
    Route::controller('user','index/User');
    
    
    //路由别名
    //我们希望使用user可以访问Home模块的User控制器的所有操作  那么我么定义别名为
    Route::alias('user','home/User');
    //或者
    return [
        '__alias__' =>  [
            'user'  =>  'home/User',
        ],
    ];
    
    //路由别名可以指向任意一个有效的路由地址,例如下面指向一个类
    // user 路由别名指向 User控制器类
    Route::alias('user','\app\index\controller\User');
    
    
    //路由分组  允许把相同前缀的路由定义合并分组
    Route::group('blog',[
        ':id'   => ['Blog/read', ['method' => 'get'], ['id' => '\d+']],
        ':name' => ['Blog/read', ['method' => 'post']],
    ],['ext'=>'html']);
    
    
    
    //MISS路由:没有匹配到所有的路由规则后执行一条设定的路由,可以使用MISS路由功能, MISS路由配置后相当于开启了强制路由
    //全局MISS路由   
    //Route::miss(); 放到路由的第一行才能生效,放到最后一行或者return里面不生效?????
    Route::miss('public/miss');//当没有匹配到所有的路由规则后,会路由到 public/miss路由地址。
    //分组MISS路由  分组支持独立的MISS路由
    //
    //
    //闭包支持:
    Route::get('hello/:name',function($name){ 
        return 'Hello,'.$name;
    });
    //闭包还支持模板师视图
    Route::get('/', function () {
        return view('admin@home/index');
    });
    
    //路由绑定
    // 绑定当前的URL到 index模块
    Route::bind('index');
    // 绑定当前的URL到 index模块的blog控制器
    Route::bind('index/blog');//http://serverName/index/blog/read/id/5可以简化成http://serverName/read/id/5 ;如果定义了路由Route::get('index/blog/:id','index/blog/read');那么访问URL就变成了http://serverName/5
    
    // 绑定当前的URL到 index模块的blog控制器的read操作
    Route::bind('index/blog/read');
    
    // 绑定命名空间
    Route::bind('\app\index\controller','namespace');//通过http://serverName/blog/read/id/5就可以直接访问 \app\index\controller\Blog类的read方法。
    
    // 绑定到类
    Route::bind('\app\index\controller\Blog','class');//通过http://serverName/read/id/5就可以直接访问 \app\index\controller\Blog类的read方法。
    
    //入口文件绑定
    // 复制一份入口文件添加define('BIND_MODULE','admin'); 命名为demo.php 我们访问这个demo.php就访问的是admin模块
    
    // 自动入口绑定
    // 配置文件开启入口文件自动绑定模块   'auto_bind_module'  =>  true,
    //复制一份index.php 改名为demo.php  访问index.php是访问index模块 访问的demo.php则访问得是demo模块
    
    //域名路由   省略

     

     

    定义路由后参数的获取问题:

    Route::get('hello/:id','index/test/hello');
    以下三种是获取不到值的:
    dump(request()->get());
    dump(request()->get('id'));
    dump(input('get.id'));
    我们只有通过:下面这几个才能获取到
    dump(request()->param());
    dump(request()->param('id'));
    dump(request()->route());
    dump(request()->route('id'));
    怎么才能让get获取到?
    参数绑定和?后面的如:
    public function hello($id){
        dump(request()->get());
        dump(input('get.'));
    }
    浏览器输入:域名/hello/10?name=123
    array (size=2)
      'name' => string '123' (length=3)
      'id' => string '10' (length=2)

    路由之后这些方法的controller和action的的值与实际的不同了

    11.// 调用Request对象的path方法
    12.{$Request.path}
    13.// 调用Request对象的module方法
    14.{$Request.module}
    15.// 调用Request对象的controller方法
    16.{$Request.controller}
    17.// 调用Request对象的action方法
    18.{$Request.action}

     

    转载于:https://www.cnblogs.com/lichihua/p/10405374.html

    展开全文
  • Tp5的使用仿百度糯米

    2019-09-26 11:04:11
    Tp5的特性 1.webserver 2.全新的分页机制 3.composer安装tp5扩展类库 4.validate数据验证机制 5.模块自动部署 6.session会话机制 7.验证码 表的设计 学习目标 1.表的创建decimal() 2.索引的使用 (知识点:二叉树...
  • -从数据库或者循环构建爬虫url(包括分页参数) -分段取出 -2 Markdown和扩展Markdown简洁语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富...
  • TP5框架安装和使用

    万次阅读 2016-10-19 11:12:09
    本章我们来试着安装一下最新出TP框架5 , TP5是TP框架一个全新变化,采用全新架构思想,引入了更多PHP新特性,优化了核心,减少了依赖,实现了真正惰性加载,支持composer,并针对API开发做了大量优化,...
  • ThinkPHP 5.0 ThinkPHP5在保持快速开发和大道至简...ThinkPHP5的运行环境要求PHP5.4以上。 详细开发文档参考 目录结构 初始的目录结构如下: www WEB部署目录(或者子目录) ├─application 应用目录 │ ├─common
  • 利用php(以及开源工具)实现爬虫流程说明从数据库或者循环构建爬虫url(包括分页参数)**分段取出使用多线程保存数据到redis**启用队列把数据保存到数据库**开始使用tp5.0框架,安装爬虫扩展 QueryList 4.0composer ...
  • tp5或者tp5.1事务中踩了不少坑,所以在这里分享一下自己趟过坑。 tp事务中遇到过不少情况导致事务没有正确回滚tp5及tp5.1如果没有任何数据更新是不会报错,这个坑可以详细参考我之前一篇博客文章...
  • 了解tp5

    2019-08-30 19:54:25
    ThinkPHP V5.0——为API...主要特性: 规范:遵循 PSR-2 、 PSR-4 规范, Composer 及单元测试支持; 严谨:异常严谨错误检测和安全机制,详细日志信息,为你开发保驾护航; 灵活:减少核心依赖,扩展更灵活...
  • 函数索引顾名思义就是加给字段加了函数索引,这里函数也可以是表达式。所以也叫表达式索引。MySQL 5.7 推出了虚拟列功能,MySQL8.0函数索引内部其实也是依据虚拟列来实现。我们考虑以下几种场景:1.对比...
  • TP5之事务回滚

    2019-09-27 17:34:48
    熟悉mysql应该都知道MySQL innodb事务及其他四大特性,持久性,隔离性,原子性,一致...事务原子性在很多场景都需要用到,如进行一组多对多关系数据表时,而在tp5中也仅需几行代码就可以解决。 Db::start...
  • ThinkPHP5.0版本是一个颠覆和重构版本,采用全新架构思想,引入了更多PHP新特性,优化了核 心,减少了依赖,实现了真正惰性加载,支持composer,并针对API开发做了大量优化,包括路由、 日志、异常、...
  • 优点:拥有简单上手的特性拥有规范化的中文文档拥有大量的开发人员(市场学习人员多)全家桶式的服务缺点:框架的自动加载任务多,非轻量级tp5改动非常大,性能比tp3好,但不易于tp3升级相对ci、yii2等...
  • tp5--模型

    2019-08-24 21:21:20
    新版模型进行了重构,更加对象化操作,包括关联模型重构,主要特性包括: 完全对象式访问 支持静态调用(查询) 支持读取器/修改器 时间戳字段自动写入 对象/数组访问 JSON序列化 模型事件触发 命名范围 类型...
  • tp5参数绑定

    2019-09-27 02:42:11
    关闭路由后普通模式任然可以通过操作方法参数绑定、控制器和空操作等特性实现url地址简化 参数绑定(默认是按名称成对解析,): namespace app\index\Controller; class Blog { public function ...
  • 本扩展包是tp5的nestedsets包,使用了部分tp5的特性实现了关系型数据库中特殊数据结构的处理。 安装方法先安装composer如果不知道怎么安装使用composer请自行百度。 打开命令行工具切换到你的tp5项目根目录...
  • tp5-rbac-api-源码

    2021-03-12 19:09:34
    ThinkPHP 5.0 ThinkPHP5在保持快速开发和大道至简...ThinkPHP5的运行环境要求PHP5.4以上。 详细开发文档参考 目录结构 初始的目录结构如下: www WEB部署目录(或者子目录) ├─application 应用目录 │ ├─common
  • WSTShop是个完全可运营的TP5商店,相当轻巧,本人去广州拜访过这个团队:),但稍有遗憾是,它开源...你能如此这样简单粗暴升级,要感谢TP5框架API式非入侵修改特性! 第二步,修改/index.php:加上以下这...
  • TP-Admin即基于ThinkPHP5的web后台管理系统(总结一套自己的后台管理系统,方便自己后续的项目开发。) 主要特性:自适应手机端、支持国际化、吸取其他CMF框架优点、多站点部署、日志记录、基础封装、账号管理、异步...
  • ## 介绍`think-orm`是一个基于PHP`5.6+` `ORM`实现,主要特性包括:- 基于ThinkPHP5.1`ORM`封装- 支持`Mysql`/`Pgsql`/`Sqlite`/`SqlServer`/`Oracle`/`Mongodb`- 基于`PDO`实现- 支持原生查询和查询构造器- ...
  • ThinkPHP5的运行环境要求PHP5.6以上。 安装 使用composer安装 composer create-project topthink/think tp 启动服务 cd tp php think run 然后就可以在浏览器中访问 http://localhost:8000 更新框架 composer ...
  • 因为合理且符合框架特性的命名可以最大化发挥框架优点,也就是扬长避短 变量名 我们从属数据输入到处理输出整个流程来看,怎么把名字起好 个人理解,希望多多指出不足 写代码之前,总结一下,哪些变量是广泛使用,...
  • tp5、yii2、ci3到底选哪个?

    千次阅读 2018-06-13 14:18:23
    他的简单上手,让新手爱不释手。他的扩展性,高性能,黄金组合lnmp,让各类创业公司迷恋。...从而,也诞生了许许多...tp5,全称是ThinkPHP。国产的一个非常优秀的框架。优点:拥有简单上手的特性拥有规范化的中文文档拥...
  • 前言传统程序执行流程一般是 即时|同步|串行,在某些场景下,会存在并发低,吞吐...thinkphp-queue 是thinkphp 官方提供一个消息队列服务,它支持消息队列一些基本特性:消息发布,获取,执行,删除,重发...
  • 前言 查询聊天列表,并返回最后一条聊天记录。...查询出自己发的消息然后联合查询接收到的消息,这里要提下union的特性,就是两个合并的查询语句 字段数量必须一致! 字段顺序必须一致! 数据类型也要相似! 原始SQ...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 185
精华内容 74
关键字:

tp5的特性