使用我自己的Laravel API

rob*_*lls 52 php api rest laravel laravel-4

我正在开发一个Laravel 4应用程序,它将通过JSON REST API和Web UI对我的数据集进行相同的CRUD操作.似乎是为了防止破坏DRY原则,即我的UI应该使用我自己的API,将所有请求从UI路由回API.我不确定这项工作的最佳方法.据推测,我会有单独的UI和API控制器,并以某种方式路由请求.或者我应该完全看一个不同的方法?

谢谢.

Jas*_*wis 49

我实际上是在修补同样的想法,它非常整洁.使用Laravel,您确实能够发出内部请求(有些人可能会将其称为HMVC,但我不会这样做).这是内部请求的基础知识.

$request = Request::create('/api/users/1', 'GET');

$response = Route::dispatch($request);
Run Code Online (Sandbox Code Playgroud)

$response现在将包含API的返回响应.通常,这将返回一个JSON编码的字符串,这对客户端很有用,但对于内部API请求来说并不是那么好.你必须在这里扩展一些东西,但基本上我的想法是返回内部调用的实际对象,并且外部请求返回格式化的JSON响应.你可以利用$response->getOriginalContent()这里的东西来做这类事情.

您应该看到的是构建某种内部Dispatcher,允许您分派API请求并返回原始对象.调度程序还应处理格式错误的请求或错误的响应,并抛出异常以匹配.

这个想法本身很扎实.但规划API是一项艰苦的工作.我建议你写一个包含所有预期端点的好列表,并草拟几个API版本,然后选择最好的一个.

  • 如果你需要更多的想法和头脑风暴跳上Freenode上的#laravel,有人通常会进行一次很好的聊天,我会在那里闲聊一下.干杯! (2认同)

Dom*_*ore 25

注意:正如vcardillo在下面指出的那样,路由过滤器不会使用这些方法调用.

我目前正在做同样的事情,杰森的回答让我朝着一个伟大的方向前进.看看Symfony\Component\HttpFoundation\Request文档,我想出了POST的方法,以及我需要做的其他事情.假设您正在使用表单,以下是一些可以帮助您的代码:

得到:

$request = Request::create('/api/users/1', 'GET');

$response = Route::dispatch($request);
Run Code Online (Sandbox Code Playgroud)

POST:

$request = Request::create('/api/users/1', 'POST', Input::get());

$response = Route::dispatch($request);
Run Code Online (Sandbox Code Playgroud)

POST w/cookies

$request = Request::create('/api/users/1', 'POST', Input::get(), Cookie::get('name'));

$response = Route::dispatch($request);
Run Code Online (Sandbox Code Playgroud)

POST w/files

$request = Request::create('/api/users/1', 'POST', Input::get(), null, Input::file('file'));

$response = Route::dispatch($request);
Run Code Online (Sandbox Code Playgroud)

我希望这有助于其他人.如果您没有使用表单,或者您没有使用Laravel的输入/ Cookie外观,请将输入/ Cookie外观替换为您自己的内容.

  • 我在所有这些问题上看到的唯一问题是没有调用路由过滤器. (2认同)

Der*_*ald 14

Taylor Otwell 建议使用app()->handle()而不是Route::dispatch()达到干净的要求.

因为Route::dispatch($request)我注意到,如果非GET请求的端点(HTTP请求主体上的参数)使用依赖注入\Illuminate\Http\Request\Illuminate\Foundation\Http\FormRequest扩展实例,则参数,cookie,文件等的状态来自原始 HTTP请求.即,为您的应用程序的控制器操作方法.

如果app控制器和API控制器的参数名称和post方法类型相同,则不会发现差异,因为传递了原始参数值.但是当你手动组装第3个参数时Request::create(),Route::dispatch()会导致它被忽略.

app()->handle() 修复了Laravel请求生命周期中的上下文问题.

警告: app()->handle()影响 Illuminate\Support\Facades\Request,使用这个新的请求实例刷新它.作为连锁效应,之后调用Request::isXmlHttpRequest()redirect()->back()调用app()->handle()将导致不可预测的行为.我建议您跟踪原始请求的上下文,然后使用,redirect()->to(route('...'))以便严格控制应用的流量和状态.

鉴于所有这些极端情况,最好只使用Guzzle HTTP客户端进行手动卷曲.


Pan*_*arg 7

如果您正在寻找内部使用passport login 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();
}
Run Code Online (Sandbox Code Playgroud)