资讯专栏INFORMATION COLUMN

thinkphp 路由

sunnyxd / 3129人阅读

摘要:路由定义文件定义下的所有的路由文件都是有效的定义路由必须使用控制器定义修改配置文件,强制路由访问此时已经开启多应用配置目录文件如下修改配置文件,启用路由

路由定义文件

route 定义下的所有的路由文件都是有效的

定义路由必须使用

use thinkfacadeRoute;

控制器定义


修改配置文件,强制路由访问

此时已经开启多应用配置

目录文件如下

修改配置文件,启用路由


// +----------------------------------------------------------------------

// +----------------------------------------------------------------------
// | 应用设置
// +----------------------------------------------------------------------

use thinkfacadeEnv;

return [
    // 应用地址
    "app_host"         => Env::get("app.host", ""),
    // 应用Trace(环境变量优先读取)
    "app_trace"        => false,
    // 应用的命名空间
    "app_namespace"    => "",
    // 是否启用路由
    "with_route"       => true,
    // 是否启用事件
    "with_event"       => true,
    // 自动多应用模式
    "auto_multi_app"   => true,
    // 应用映射(自动多应用模式有效)
    "app_map"          => [],
    // 域名绑定(自动多应用模式有效)
    "domain_bind"      => [],
    // 禁止URL访问的应用列表(自动多应用模式有效)
    "deny_app_list"    => [],
    // 默认应用
    "default_app"      => "index",
    // 默认时区
    "default_timezone" => "Asia/Shanghai",
    // 默认验证器
    "default_validate" => "",

    // 异常页面的模板文件
    "exception_tmpl"   => app()->getThinkPath() . "tpl/think_exception.tpl",

    // 错误显示信息,非调试模式有效
    "error_message"    => "页面错误!请稍后再试~",
    // 显示错误信息
    "show_error_msg"   => true,
];

再次修改配置文件,强制路由


// +----------------------------------------------------------------------

// +----------------------------------------------------------------------
// | 应用设置
// +----------------------------------------------------------------------

return [
    // PATHINFO变量名 用于兼容模式
    "var_pathinfo"          => "s",
    // 兼容PATH_INFO获取
    "pathinfo_fetch"        => ["ORIG_PATH_INFO", "REDIRECT_PATH_INFO", "REDIRECT_URL"],
    // pathinfo分隔符
    "pathinfo_depr"         => "/",
    // HTTPS代理标识
    "https_agent_name"      => "",
    // URL伪静态后缀
    "url_html_suffix"       => "html",
    // URL普通方式参数 用于自动生成
    "url_common_param"      => true,
    // 是否开启路由延迟解析
    "url_lazy_route"        => false,
    // 是否强制使用路由
    "url_route_must"        => true,
    // 合并路由规则
    "route_rule_merge"      => false,
    // 路由是否完全匹配
    "route_complete_match"  => false,
    // 使用注解路由
    "route_annotation"      => false,
    // 是否开启路由缓存
    "route_check_cache"     => false,
    // 路由缓存连接参数
    "route_cache_option"    => [],
    // 路由缓存Key
    "route_check_cache_key" => "",
    // 访问控制器层名称
    "controller_layer"      => "controller",
    // 空控制器名
    "empty_controller"      => "Error",
    // 是否使用控制器后缀
    "controller_suffix"     => false,
    // 默认的路由变量规则
    "default_route_pattern" => "[w.]+",
    // 域名根,如thinkphp.cn
    "url_domain_root"       => "",
    // 是否自动转换URL中的控制器和操作名
    "url_convert"           => true,
    // 表单请求类型伪装变量
    "var_method"            => "_method",
    // 表单ajax伪装变量
    "var_ajax"              => "_ajax",
    // 表单pjax伪装变量
    "var_pjax"              => "_pjax",
    // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
    "request_cache"         => false,
    // 请求缓存有效期
    "request_cache_expire"  => null,
    // 全局请求缓存排除规则
    "request_cache_except"  => [],
    // 默认控制器名
    "default_controller"    => "Index",
    // 默认操作名
    "default_action"        => "index",
    // 操作方法后缀
    "action_suffix"         => "",
    // 默认JSONP格式返回的处理方法
    "default_jsonp_handler" => "jsonpReturn",
    // 默认JSONP处理方法
    "var_jsonp_handler"     => "callback",
];

再次定义admin下的路由


此时访问 http://localhost:8082/admin/ming/34

已经开始路由

正常访问

没有路由

此时开启强制路由以后,首页需要开启路由

由于默认的应用为index 所以需要在route定义index

目录如下

定义首页目录


此时访问首页
http://localhost:8082/
会被重定向到 index控制器下的index方法

变量规则

变量规则,这里定义的是

Route::get("new/:name", "News/read")
    ->pattern(["name" => "[w|-]+"]);

此时匹配的是name变量的匹配的规则,匹配的规则是双斜杠

路由规则
// 定义动态路由
Route::get("hello/:name", "index/:name/hello");

可以做到把一个变量传入另外一个路由中

路由地址

路由到控制器的操作
添加一个控制器

此控制器使用appadmincontroller 命名空间 其文件内容如下


传入$id作为参数

再次定义路由规则如下

Route::get("blog/:id", "Blog/read");

此时访问admin模块下的blog内容,会匹配:id的内容,
http://localhost:8082/admin/blog/23/ 此时会匹配23内容

其结果如下

路由地址 路由到控制器操作

路由到控制器和操作

上面的例子就是

路由到类的方法

这种方式可以执行任何方法

Route::get("blog/:id","appindexserviceBlog@read");
Route::get("blog/:id","appindexserviceBlog::read");

上方执行的是Blog的read方法或者read的静态方法

重定向路由
Route::redirect("blog/:id", "http://blog.thinkphp.cn/read/:id", 302);

使用302重定向一个新的地址

路由到模板

使用路由到模板直接渲染


访问 http://localhost:8082/admin/blog/ 此时会渲染出

闭包支持

使用闭包可以使用一些特殊需求的路由,不需要再次执行控制器的操作了


http://localhost:8082/admin/blog/34

闭包中可以实现依赖注入

method();
    return $method . $name;
});

此时由于依赖request会自动注入request

路由参数

对当前的路由进行匹配。。

ext("html")   // url 后缀检测
    ->https();  // https 检测

只有全部符合要求才能匹配到

额外追加参数

使用append额外追加参数

append(
    ["app_id" => 1, "status" => 1]
);

此时会传入两个参数 app_id 和 status 两个参数

绑定模型

支持绑定模型

Route::get("hello/:id", "index/hello")
    ->model("appindexmodelUser");

支持从模型层中直接获取数据

同时可以使用闭包,获取数据

Route::rule("hello/:id", "index/hello")
    ->model(function ($id) {
        $model = new appindexmodelUser;
        return $model->where("id", $id)->find();
    });
请求缓存
Route::get("new/:name$", "News/read")
    ->cache(3600);

表示直接请求3600秒

路由中间件

可以在路由中,数据直接传给中间件

路由分组

可以对公有的路由进行分组操作

ext("html")->pattern([
    "id" => "d+",
    "name" => "w+"
]);

此时,可以根据正则匹配路由

资源路由


此时访问
http://localhost:8082/admin/blog/34/edit 会调用edit方法
http://localhost:8082/admin/blog/34/read 会调用read方法

资源嵌套

路由支持资源嵌套

注解路由

修改配置文件,实现注解路由


// +----------------------------------------------------------------------

// +----------------------------------------------------------------------
// | 应用设置
// +----------------------------------------------------------------------

return [
    // PATHINFO变量名 用于兼容模式
    "var_pathinfo"          => "s",
    // 兼容PATH_INFO获取
    "pathinfo_fetch"        => ["ORIG_PATH_INFO", "REDIRECT_PATH_INFO", "REDIRECT_URL"],
    // pathinfo分隔符
    "pathinfo_depr"         => "/",
    // HTTPS代理标识
    "https_agent_name"      => "",
    // URL伪静态后缀
    "url_html_suffix"       => "html",
    // URL普通方式参数 用于自动生成
    "url_common_param"      => true,
    // 是否开启路由延迟解析
    "url_lazy_route"        => false,
    // 是否强制使用路由
    "url_route_must"        => true,
    // 合并路由规则
    "route_rule_merge"      => false,
    // 路由是否完全匹配
    "route_complete_match"  => false,
    // 使用注解路由
    "route_annotation"      => true,
    // 是否开启路由缓存
    "route_check_cache"     => false,
    // 路由缓存连接参数
    "route_cache_option"    => [],
    // 路由缓存Key
    "route_check_cache_key" => "",
    // 访问控制器层名称
    "controller_layer"      => "controller",
    // 空控制器名
    "empty_controller"      => "Error",
    // 是否使用控制器后缀
    "controller_suffix"     => false,
    // 默认的路由变量规则
    "default_route_pattern" => "[w.]+",
    // 域名根,如thinkphp.cn
    "url_domain_root"       => "",
    // 是否自动转换URL中的控制器和操作名
    "url_convert"           => true,
    // 表单请求类型伪装变量
    "var_method"            => "_method",
    // 表单ajax伪装变量
    "var_ajax"              => "_ajax",
    // 表单pjax伪装变量
    "var_pjax"              => "_pjax",
    // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
    "request_cache"         => false,
    // 请求缓存有效期
    "request_cache_expire"  => null,
    // 全局请求缓存排除规则
    "request_cache_except"  => [],
    // 默认控制器名
    "default_controller"    => "Index",
    // 默认操作名
    "default_action"        => "index",
    // 操作方法后缀
    "action_suffix"         => "",
    // 默认JSONP格式返回的处理方法
    "default_jsonp_handler" => "jsonpReturn",
    // 默认JSONP处理方法
    "var_jsonp_handler"     => "callback",
];

添加注解,实现路由


路由绑定

支持绑定到控制器操作,命名空间,和类

// 绑定当前的URL到 Blog控制器
Route::bind("blog");
// 绑定当前的URL到 Blog控制器的read操作
Route::bind("blog/read");

原先访问 http://serverName/blog/read/id/5
需要访问 http://serverName/read/id/5 可以访问到

剩下的还可以绑定到命名空间 类

域名路由

使用 Route::domain 绑定子域

路由缓存

MISS 路由

MISS路由为全局最后一条执行的路由

跨域请求

通过allowCrossDomain 进行跨域请求

URL请求

用于生成url请求
路由规则


 5, "name" => "ming"]));
        return $id;
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31606.html

相关文章

  • 浅谈ThinkPHP 5.0

    摘要:杰出的数据库迁移工具和紧密集成的单元测试支持,这些工具赋予你构建任何应用的能力。浅谈应公司要求,现在用重新搭一个框架,接触了几天对它也有了一定的了解。浅谈支持,支持单元测试。更加严谨了,异常严谨的错误检测和安全机制。 自从接触php开始,用的就是thinkphp框架,它给我的感觉是轻量,且容易上手。后来进了一家外包公司又用了laravel框架,个人觉得laravel还是很高大上的,功能...

    mtunique 评论0 收藏0
  • Thinkphp 终极路由解决方案(超级伪静态)闭包的爽快使用

    在ThinkPHP中我们使用伪静态的时候会产生一些问题,从而不能够很方便在用apache的rewrite规则来解决,不过官方因为这个问题给大家提供了一种高级解决方案就是route 我在使用ThinkPHP做项目的时候遇到这样的事情 route的规则是要匹配一下控制器 这就是官方在路由的例子里面为什么不使用别的方式,我也纳闷官方为什么没有解决这个问题 看官方的例子,然后我在写我的需求 ...

    izhuhaodev 评论0 收藏0
  • ThinkPHP5 学习笔记

    摘要:抽象数据库访问层作用对不同数据库的操作进行封装,最终达到用统一的操作方式操作不同数据库连接器隐藏不同数据库连接的差异,自动加载对应的数据库驱动查询构建起隐藏不同数据库的差异,自动拼接路由层什么是路由每个框架都具有路由功能,所谓路由就是用户请 抽象数据库访问层 作用:对不同数据库的操作进行封装,最终达到:用统一的操作方式操作不同数据库 连接器:隐藏不同数据库连接的差异,自动加载对应的数...

    you_De 评论0 收藏0
  • thinkphp源码分析(一)—开门篇

    摘要:源码分析开门篇生命周期入口文件用户发起的请求都会经过应用的入口文件,通常是文件。注册错误和异常机制执行注册错误和异常处理机制。由三部分组成应用关闭方法错误处理方法异常处理方法注册应用关闭方法是为了便于拦截一些系统错误。 源码分析—开门篇 thinkphp生命周期 1、入口文件 用户发起的请求都会经过应用的入口文件,通常是 ==public/index.php==文件。当然,你也可以更改...

    flybywind 评论0 收藏0
  • ThinkPhp学习笔记(一)

    摘要:如上为三个模块行为行为是在预先定义好的一个应用位置执行的一些操作。发生作用的位置称之为钩子,当应用程序运行到这个钩子的时候,就会被拦截下来,统一执行相关的行为。给某一个钩子绑定相关行为就成了一种类编程的思想。 ThinkPhp5.0 Composer: php世界里的包管理器 目录结构 project 应用部署目录 ├─application 应用目录(可设置) ...

    imtianx 评论0 收藏0
  • 解读 thinkphp5 源码(二):异常处理和请求生命周期

    摘要:异常处理上节解读源码一自动加载看完了自动加载部分,根据代码执行顺序,的行注册错误和异常处理机制加载惯例配置文件下面的加载配置文件不用说,现在重点看一下异常处理。博客链接解读源码二异常处理和请求生命周期 异常处理 上节解读 thinkphp5 源码(一):自动加载看完了自动加载部分,根据代码执行顺序,base.php的59-64行 // 注册错误和异常处理机制 hinkError::r...

    yuanzhanghu 评论0 收藏0

发表评论

0条评论

sunnyxd

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<