我正在开发一个Laravel 4的应用程序,这将使通过一个JSON REST API以及Web UI,可我的数据集相同的CRUD操作。 看来,以防止破坏DRY原则,我的用户界面应该由路由从UI的所有请求回API消费我自己的API。 我不能确定,虽然即将使这项工作的最佳方法。 大概我会独立的用户界面和API控制器并以某种方式将请求路由通过。 或者我应该寻找一个不同的方法完全?
谢谢。
我正在开发一个Laravel 4的应用程序,这将使通过一个JSON REST API以及Web UI,可我的数据集相同的CRUD操作。 看来,以防止破坏DRY原则,我的用户界面应该由路由从UI的所有请求回API消费我自己的API。 我不能确定,虽然即将使这项工作的最佳方法。 大概我会独立的用户界面和API控制器并以某种方式将请求路由通过。 或者我应该寻找一个不同的方法完全?
谢谢。
实际上,我有同样的想法,修修补补,它是非常整洁。 随着Laravel你必须使内部请求的能力(有些人可能将此称为HMVC,但我不会)。 下面是一个内部请求的基础。
$request = Request::create('/api/users/1', 'GET');
$response = Route::dispatch($request);
$response
现在包含API返回的响应。 通常,这将返回一个JSON编码字符串这是伟大的客户,但不是伟大的内部API请求。 你必须在这里延长了一些东西,但基本思路是通过回为内部调用返回实际的对象,并为外部请求返回JSON格式的响应。 您可以使用的东西像$response->getOriginalContent()
这里这种事情。
你应该看看这样做是构建一些内部的Dispatcher
,可以让你派遣API请求并返回原来的对象。 调度员也应该处理畸形请求或不良反应,并抛出异常相匹配。
这个想法本身是固体。 但规划的API是艰苦的工作。 我建议你写你的所有预期端点的好名单,并起草了几个API的版本,然后选择最好的一个。
注:由于vcardillo指出以下,路由过滤器不调用这些方法。
我目前正在做同样的事情,和杰森的回答让我在一个大的方向去。 综观的Symfony \分量\ HttpFoundation \请求的文档,我想通了,如何发布,以及一切我需要做的。 您使用的是形式假设,这里是一些代码,可以帮助你:
得到:
$request = Request::create('/api/users/1', 'GET');
$response = Route::dispatch($request);
POST:
$request = Request::create('/api/users/1', 'POST', Input::get());
$response = Route::dispatch($request);
POST W /饼干
$request = Request::create('/api/users/1', 'POST', Input::get(), Cookie::get('name'));
$response = Route::dispatch($request);
POST W /文件
$request = Request::create('/api/users/1', 'POST', Input::get(), null, Input::file('file'));
$response = Route::dispatch($request);
我希望这可以帮助别人。 如果您使用的不是形式,或者你但不使用Laravel的输入/ Cookie的门面,用自己的内容更换输入/ Cookie的门面。
泰勒Otwell 建议使用app()->handle()
而不是Route::dispatch()
实现了清洁请求。
对于Route::dispatch($request)
我注意到,如果你的非GET请求(在HTTP请求的身体参数)使用依赖注入了终点\Illuminate\Http\Request
或\Illuminate\Foundation\Http\FormRequest
延长例如,的参数,饼干,文件等状态是从原来的HTTP请求。 即,对于您的应用程序控制器的操作方法。
如果参数名称和POST方法类型为您的应用程序控制器和API控制器是相同的,因为原来的参数值传给你不会注意到其中的差别。 但是当你手工组装的第三个参数Request::create()
Route::dispatch()
会导致它被忽略。
app()->handle()
固定在Laravel请求生命周期这方面的问题。
警告: app()->handle()
影响Illuminate\Support\Facades\Request
,这个新的请求实例刷新它。 作为一个连锁效应,呼吁像Request::isXmlHttpRequest()
或redirect()->back()
之后被调用app()->handle()
将导致不可预知的行为。 我建议跟踪你的原始请求的情况下,转而使用redirect()->to(route('...'))
所以你严格控制你的应用程序的流量和状态。
考虑到所有这些角落的情况下,它可能是最好只是做使用手工卷曲狂饮HTTP客户端 。
如果你消耗自己的API,使用app()->handle()
而不是Route::dispatch()
德里克·麦克唐纳曾建议。
app()->handle()
创建了一个新的要求,而Route::dispatch()
运行堆栈内的路线,有效地忽略这是你发送请求的部分参数。
编辑 :只是抬头。 泰勒Otwell 建议不要使用子请求进行内部API调用,因为他们乱七八糟的电流路径 。 您可以在HTTP API客户喜欢Guzzle
,而不是使API调用。
您可以使用擎天柱API消费者 ,API是干净和简单,例如使内部请求:
$response = app()->make('apiconsumer')->post('/oauth/token', $data);
在它的核心,它采用Illuminate\Routing\Router
和Illuminate\Http\Request
拨打电话
// create the request
$this->request->create($uri, $method, $data, [], [], $server, $content);
// get the response
$response = $this->router->prepareResponse($request, $this->app->handle($request));
如果您正在寻找内部使用护照登录API,那么你需要添加参数原始请求:
protected function manualLogin(Request $request)
{
$email = $request->input('email');
$password = $request->input('password');
$request->request->add([
'username' => $email,
'password' => $password,
'grant_type' => 'password',
'client_id' => $clientID,
'client_secret' => $clientSecret,
'scope' => '*']);
$newRequest = Request::create('/oauth/token', 'post');
return Route::dispatch($newRequest)->getContent();
}
如果您正在寻找内部使用护照登录API,那么你需要添加参数原始请求:
protected function manualLogin(Request $request)
{
$email = $request->input('email');
$password = $request->input('password');
$request->request->add([
'username' => $email,
'password' => $password,
'grant_type' => 'password',
'client_id' => $clientID,
'client_secret' => $clientSecret,
'scope' => '*']);
$newRequest = Request::create('/oauth/token', 'post');
return Route::dispatch($newRequest)->getContent();
}