遇到了一个奇怪的 Request 问题
问题: 自己创建了TestRequest 类去继承 Illuminate\Http\Request 在Controller 中去use TestRequest
在Controller 取不到值 下面是代码
TestRequest:
<?php
namespace App\Http\Requests\Course;
use Illuminate\Http\Request;
class TestRequest extends Request
{
}
Controller:
<?php
namespace App\Http\Controllers\Api\Course;
use App\Http\Controllers\Controller;
use App\Http\Requests\Course\TestRequest;
class ElectiveController extends Controller
{
/**
* 选修课列表
* @param TestRequest $request
*/
public function index(TestRequest $request)
{
$token = $request->get('token');
dd($request);
}
}
token的打印:
null
request的打印:
我试了一下 直接在Controller 中继承 Illuminate\Http\Request 是可以取到值的
我的想法是 在初始化的时候有问题 所以里面的都是null
我也尝试了 直接让TestReques继承 Illuminate\Foundation\Http\FormRequest; 是可以取到值的
奥秘在入口文件
public/index.php
Illuminate\Http\Request::capture()
方法会调用SymfonyRequest
,获取解析之后的请求对象,大部分请求参数的解析操作在SymfonyRequest
类里面实现,有兴趣可以查看下createFromGlobals
方法的实现再回到
HttpKernel
的handle
方法,这个方法里面就把传入的request
对象注册到了服务容器中查看
$this->sendRequestThroughRouter($request)
方法那么为什么可以通过
Illuminate\Http\Request
获取到这个request
对象?那就需要看一下服务容器是怎么注册
Illuminate\Http\Request
的,这里找了半天没找到相关的代码,然后我就把dd(app())
出来看了一下,发现服务容器的aliases
和abstractAliases
有建立Illuminate\Http\Request
到request
的映射,然后在服务容器的初始化方法里看到有调用注册abstractAliases
的方法进
registerCoreContainerAliases
方法会看到一个二维数组,二维数组里面就定义了一系列的类别名,可以看到这里把request
作为Illuminate\Http\Request
和Symfony\Component\HttpFoundation\Request
的别名,这样就把这两个类绑定到了app('request')
,进而可以获取到之前注册给request
键的request对象实例现在你就明白了,直接继承
Request
是不行的,你需要通过一种机制去调用Illuminate\Http\Request::capture()
,这个方法返回的才是你所需要的