我正在写一个简单的API,以及建立在这个API之上的简单的Web应用程序。
因为我想“消费我自己的API”直接,我第一次用Google搜索,发现在计算器上这个答案,完全回答我最初的问题: 消费我自己Laravel API
现在,这个伟大的工程,我能够通过执行类似访问我的API:
$request = Request::create('/api/cars/'.$id, 'GET');
$instance = json_decode(Route::dispatch($request)->getContent());
这很棒! 但是,我的API还允许您添加一个可选字段参数的GET查询字符串来指定要返回的特定属性,比如这个:
http://cars.com/api/cars/1?fields=id,color
现在,我居然在API中处理这个问题的方法是沿此线的东西:
public function show(Car $car)
{
if(Input::has('fields'))
{
//Here I do some logic and basically return only fields requested
....
...
}
我会认为我可以做同样的事情,因为我与查询字符串参数少之前的方式,像这样做:
$request = Request::create('/api/cars/' . $id . '?fields=id,color', 'GET');
$instance = json_decode(Route::dispatch($request)->getContent());
但是,这似乎并非如此。 长话短说,逐步执行代码后,似乎Request
对象正确创建(并正确翻出fields参数并指定ID,颜色吧),路径似乎出动OK,但我的API控制器内本身我不知道如何访问字段参数。 使用Input::get('fields')
这是我使用的“正常”的请求)返回任何内容,我相当肯定,是因为静态Input
被引用或范围界定初始请求进来,而不是新的请求我“手动”派遣从应用程序本身。
所以,我的问题是真的我应该怎么做呢? 难道我做错了什么? 理想情况下,我想,以避免在我的API控制器做什么丑陋或特殊的,我希望能够使用输入::获得的内部调度的请求,而不必进行第二次检查,等等。
你是在用正确的Input
实际上是参考当前的请求,而不是新创建的请求。 您的意见将可以在您使用实例请求实例本身Request::create()
如果您正在使用(你应该是) Illuminate\Http\Request
来实例化你的要求,那么你可以使用$request->input('key')
或$request->query('key')
从查询中获取参数串。
现在,这里的问题是,你可能没有你Illuminate\Http\Request
例如在路线提供给您。 这里的一个解决方案(这样就可以继续使用该Input
门面)是物理更换输入当前请求,然后再切换回来。
// Store the original input of the request and then replace the input with your request instances input.
$originalInput = Request::input();
Request::replace($request->input());
// Dispatch your request instance with the router.
$response = Route::dispatch($request);
// Replace the input again with the original request input.
Request::replace($originalInput);
这应该工作(理论上),你仍然应该能够前后内部API提出请求后,使用原来的请求输入。
我也只是面临着这个问题,并感谢杰森的伟大的答案,我能够使它发挥作用。
只是想补充一点,我发现,该航线也需要更换。 否则Route::currentRouteName()
会在脚本稍后返回派出路线。
更多详细信息,这可以在我找到的博客文章 。
我也做了堆放问题,一些测试,所谓的内部API方法反复从内部彼此使用这种方法。 它的工作就好了! 所有请求和路线已正确设置。
如果你想调用一个内部API,并通过一个数组(而不是查询字符串)传递参数,你可以这样做:
$request = Request::create("/api/cars", "GET", array(
"id" => $id,
"fields" => array("id","color")
));
$originalInput = Request::input();//backup original input
Request::replace($request->input());
$car = json_decode(Route::dispatch($request)->getContent());//invoke API
Request::replace($originalInput);//restore orginal input
编号: Laravel:调用自己的API
文章来源: How can I access query string parameters for requests I've manually dispatched in Laravel 4?