Laravel的Request怎么自动转换成对象

比如

// GET http://localhost/path?x=3
function test(Request $req)
{
    $req->x; // <- 其实自动转换成了  /app/xxx/X 对象
}

// app/xxx/X.php
class X {
    public $val;

    public function __construct($value)
    {
        $this->val = $value;
    }
}

补充描述:
http://localhost/path?x=3
拿到x实际会是 一个指定对象。比如对象:

class amount
{
    function __cons...($value);
    function asInt(): return $this->value * 100;
    function asDecimal(): return bcadd($this->value, 0, 2);
}

然后在控制器里拿$req->x会直接取到 amount 这个对象

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

咩懂,$req 本身就是一个对象啊,转个啥?

2年前 评论
66

楼主是想问 request是怎么通过箭头->拿到参数?
我猜应该是

public function __get($name){

}

public function __set($name,$value){

}
2年前 评论

@66 要是这个问题的话,那直接看源码呗,很简单:

file

在初始化框架时,会实例化一个 $request 对象,此对象已将地址中 ? 后的参数变为数组存储到query属性中。当通过$request->x以对象属性的方式访问字段时,由于 $request 对象中没有x属性,php 语言的机制会自动调用__get()魔术方法。__get()方法中可以看到,通过query属性中的键名来获取对应的值,如果query属性中没有指定的键名,便会从路由中获取键名对应的值。

举个例子,在路由文件routes/web.php中定义一个路由:

Route::get('/hello/{name}', function (\Illuminate\Http\Request $request) {
    return 'hello '.$request->name.' age:'.$request->age;
});

访问这个http://localhost/hello/LiamHao?age=18路由:

Laravel

2年前 评论
66 2年前
LiamHao (作者) 2年前

还是想知道 直接进行模型绑定的

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!