好的,所以我有以下情况:
我正在构建的系统是从 REST api 检索数据并将该数据保存到数据库中。我想知道的是如何实现这一点,以及这种行为在 Laravel 结构(控制器、模型等)的意义上会在哪里?Laravel 是否有内置机制来从外部来源检索数据?
编辑: Buzz已经有一年多没有更新了,建议现在使用Guzzle,请参阅Mohammed Safeer 的回答。
我使用Buzz 包来发出 API 请求。
require
您可以通过将其添加到文件中的部分来添加此包composer.json
。
{
require: {
"kriswallsmith/buzz": "dev-master"
}
}
然后运行composer update
安装它。
然后在 Laravel 中,您可以将其包装在一个类(可能是类似存储库的类)中,该类处理发出 API 请求并返回数据以供您的应用程序使用。
<?php namespace My\App\Service;
class SomeApi {
public function __construct($buzz)
{
$this->client = $buzz;
}
public function getAllWidgets()
{
$data = $this->client->get('http://api.example.com/all.json');
// Do things with data, etc etc
}
}
注意:这是伪代码。您需要创建一个满足您需求的类,并执行您想要/需要的任何花哨的依赖注入或代码架构。
正如@Netbulae 指出的那样,存储库可能会对您有所帮助。他链接的文章是一个很好的起点。本文与您的代码将执行的操作之间的唯一区别是,您不是使用 Eloquent 模型从数据库中获取数据,而是发出 API 请求并将结果转换为应用程序可以执行的一组数组/对象使用(本质上,只是数据存储不同,这是首先使用存储库类的好处之一)。
我们可以在 Laravel 中使用 Guzzle 包,它是一个用于发送 HTTP 请求的 PHP HTTP 客户端。
您可以通过 composer 安装 Guzzle
composer require guzzlehttp/guzzle:~6.0
或者您可以将 Guzzle 指定为项目现有 composer.json 中的依赖项
{
"require": {
"guzzlehttp/guzzle": "~6.0"
}
}
laravel 5 中使用 Guzzle 的示例代码如下所示,
use GuzzleHttp\Client;
class yourController extends Controller {
public function saveApiData()
{
$client = new Client();
$res = $client->request('POST', 'https://url_to_the_api', [
'form_params' => [
'client_id' => 'test_id',
'secret' => 'test_secret',
]
]);
$result= $res->getBody();
dd($result);
}
首先你必须在你的app/routes.php
/*
API Routes
*/
Route::group(array('prefix' => 'api/v1', 'before' => 'auth.basic'), function()
{
Route::resource('pages', 'PagesController', array('only' => array('index', 'store', 'show', 'update', 'destroy')));
Route::resource('users', 'UsersController');
});
注意:如果API调用不需要认证,可以去掉'before' => 'auth.basic'
在这里,您可以index, store, show, update and destroy
从PagesController
.
请求网址将是,
GET http://localhost/project/api/v1/pages // this will call index function
POST http://localhost/project/api/v1/pages // this will call store function
GET http://localhost/project/api/v1/pages/1 // this will call show method with 1 as arg
PUT http://localhost/project/api/v1/pages/1 // this will call update with 1 as arg
DELETE http://localhost/project/api/v1/pages/1 // this will call destroy with 1 as arg
命令行 CURL 请求将是这样的(这里的用户名和密码是admin
)并假设您有要从 url.htaccess
中删除的文件,index.php
curl --user admin:admin localhost/project/api/v1/pages
curl --user admin:admin -d 'title=sample&slug=abc' localhost/project/api/v1/pages
curl --user admin:admin localhost/project/api/v1/pages/2
curl -i -X PUT --user admin:admin -d 'title=Updated Title' localhost/project/api/v1/pages/2
curl -i -X DELETE --user admin:admin localhost/project/api/v1/pages/1
接下来,您的文件夹中有两个名为和 的控制器PagesController.php
。UsersController.php
app/controllers
PagesController.php,
<?php
class PagesController extends BaseController {
/**
* Display a listing of the resource.
*
* @return Response
* curl --user admin:admin localhost/project/api/v1/pages
*/
public function index() {
$pages = Page::all();;
return Response::json(array(
'status' => 'success',
'pages' => $pages->toArray()),
200
);
}
/**
* Store a newly created resource in storage.
*
* @return Response
* curl --user admin:admin -d 'title=sample&slug=abc' localhost/project/api/v1/pages
*/
public function store() {
// add some validation also
$input = Input::all();
$page = new Page;
if ( $input['title'] ) {
$page->title =$input['title'];
}
if ( $input['slug'] ) {
$page->slug =$input['slug'];
}
$page->save();
return Response::json(array(
'error' => false,
'pages' => $page->toArray()),
200
);
}
/**
* Display the specified resource.
*
* @param int $id
* @return Response
* curl --user admin:admin localhost/project/api/v1/pages/2
*/
public function show($id) {
$page = Page::where('id', $id)
->take(1)
->get();
return Response::json(array(
'status' => 'success',
'pages' => $page->toArray()),
200
);
}
/**
* Update the specified resource in storage.
*
* @param int $id
* @return Response
* curl -i -X PUT --user admin:admin -d 'title=Updated Title' localhost/project/api/v1/pages/2
*/
public function update($id) {
$input = Input::all();
$page = Page::find($id);
if ( $input['title'] ) {
$page->title =$input['title'];
}
if ( $input['slug'] ) {
$page->slug =$input['slug'];
}
$page->save();
return Response::json(array(
'error' => false,
'message' => 'Page Updated'),
200
);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return Response
* curl -i -X DELETE --user admin:admin localhost/project/api/v1/pages/1
*/
public function destroy($id) {
$page = Page::find($id);
$page->delete();
return Response::json(array(
'error' => false,
'message' => 'Page Deleted'),
200
);
}
}
然后你有名为的模型Page
,它将使用名为的表pages
。
<?php
class Page extends Eloquent {
}
你可以使用 Laravel4 Generators 通过php artisan generator
命令创建这些资源。在这里阅读。
因此,使用此路由分组,您可以使用相同的应用程序来发出 API 请求并作为前端。
您可以选择使用什么:
文件获取内容:
$json = json_decode(file_get_contents('http://host.com/api/v1/users/1'), true);
尝试查看外部 API 的手册。在那里,您将找到有关如何检索信息的信息。
那么最好的计划是构建一个接口。看看这个: http ://culttt.com/2013/07/08/creating-flexible-controllers-in-laravel-4-using-repositories/
这取决于你如何使用 php 来解决这个问题。