thinkphp 请求信息

本文介绍了如何使用ThinkPHP中的Request类来获取当前请求的各种信息,包括URL、域名、路径、参数等,并展示了如何通过该类的方法来设置和获取模块、控制器及操作名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果要获取当前的请求信息,可以使用\think\Request类,
除了下文中的

$request = Request::instance();

也可以使用助手函数

$request = request();

当然,最方便的还是使用注入请求对象的方式来获取变量。
例如:
获取URL信息

$request = Request::instance();
// 获取当前域名
echo 'domain: ' . $request->domain() . '<br/>';
// 获取当前入口文件
echo 'file: ' . $request->baseFile() . '<br/>';
// 获取当前URL地址 不含域名
echo 'url: ' . $request->url() . '<br/>';
// 获取包含域名的完整URL地址
echo 'url with domain: ' . $request->url(true) . '<br/>';
// 获取当前URL地址 不含QUERY_STRING
echo 'url without query: ' . $request->baseUrl() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root:' . $request->root() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root with domain: ' . $request->root(true) . '<br/>';
// 获取URL地址中的PATH_INFO信息
echo 'pathinfo: ' . $request->pathinfo() . '<br/>';
// 获取URL地址中的PATH_INFO信息 不含后缀
echo 'pathinfo: ' . $request->path() . '<br/>';
// 获取URL地址中的后缀信息
echo 'ext: ' . $request->ext() . '<br/>';

输出结果为:

domain: http://tp5.com
file: /index.php
url: /index/index/hello.html?name=thinkphp
url with domain: http://tp5.com/index/index/hello.html?name=thinkphp
url without query: /index/index/hello.html
root:
root with domain: http://tp5.com
pathinfo: index/index/hello.html
pathinfo: index/index/hello
ext: html


设置/获取 模块/控制器/操作名称

$request = Request::instance();
echo "当前模块名称是" . $request->module();
echo "当前控制器名称是" . $request->controller();
echo "当前操作名称是" . $request->action();


如果当前访问的地址是 http://serverName/index.php/index/hello_world/index
输出结果为:

当前模块名称是index
当前控制器名称是HelloWorld
当前操作名称是index

设置模块名称值需要向module方法中传入名称即可,同样使用于设置控制器名称和操作名称
Request::instance()->module('module_name');

获取请求参数
$request = Request::instance();
echo '请求方法:' . $request->method() . '<br/>';
echo '资源类型:' . $request->type() . '<br/>';
echo '访问ip地址:' . $request->ip() . '<br/>';
echo '是否AJax请求:' . var_export($request->isAjax(), true) . '<br/>';
echo '请求参数:';
dump($request->param());
echo '请求参数:仅包含name';
dump($request->only(['name']));
echo '请求参数:排除name';
dump($request->except(['name']));

输出结果为:

请求方法:GET
资源类型:html
访问ip地址:127.0.0.1
是否Ajax请求:false
请求参数:
array (size=2)
'test' => string 'ddd' (length=3)
'name' => string 'thinkphp' (length=8)

请求参数:仅包含name
array (size=1)
'name' => string 'thinkphp' (length=8)

请求参数:排除name
array (size=1)
'test' => string 'ddd' (length=3)
### ThinkPHP 请求跨域解决方案 #### 中间件处理跨域 在ThinkPHP中,一种常见且高效的方式是通过配置中间件来解决跨域问题。创建一个新的中间件类,在该类中的`handle()`函数里设置HTTP头部信息以允许来自同源的请求[^2]。 ```php namespace app\http\middleware; class CorsMiddleware { public function handle($request, \Closure $next) { header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization"); header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); if ($request->isOptions()) { return response()->json([], 204); } return $next($request); } } ``` 之后需注册此中间件到全局应用或特定路由上以便生效。 #### 控制器内直接设置响应头 另一种较为简便的方法是在具体的控制器动作内部手动添加必要的CORS(Cross-Origin Resource Sharing)相关HTTP头部字段。这种方式适合于仅针对某些API接口开放跨域访问权限的情况[^1]。 ```php public function index(){ // 设置跨域资源共享(CORS) HTTP 头部 header("Access-Control-Allow-Origin: *"); echo json_encode(['message' => 'Hello World']); } ``` #### 配置文件方式 对于更广泛的场景以及遵循官方建议的最佳实践,则可以在项目的入口脚本(`public/index.php`)处统一设定这些头部信息;亦或是利用路由定义时调用`allowCrossDomain()`辅助函数完成相同目的[^3]。 ```php // 在 public/index.php 文件顶部加入如下代码片段 header("Access-Control-Allow-Origin: *"); if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { header("Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type"); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS'); exit(); } // 或者在 route/route.php 中指定某条或多条路由规则的同时开启 CORS 支持 use think\facade\Route; Route::get('/example', 'ExampleController@index')->allowCrossDomain(); ``` 以上三种途径均可有效应对大多数情况下遇到的跨域难题,开发者可根据实际需求选取最合适的方案实施部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值