わかりましたので、次の状況があります。
私が構築しているシステムは、REST apiからデータを取得し、そのデータをデータベースに保存しています。どのようにこれを実装でき、このような動作はLaravels構造(コントローラ、モデルなど)?Laravelは外部ソースからデータを取得するためのメカニズムを内蔵していますか?
まず、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'
を削除できます。
ここでは、PagesController
からindex, store, show, update and destroy
メソッドにアクセスできます。
リクエストURLは次のようになります。
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
という名前の2つのコントローラーがあります。
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リクエストをフロントエンドとして使用できます。
Edit:Buzz は1年以上更新されていないため、 Guzzle を使用することをお勧めします=、 Mohammed Safeer's 回答を参照してください。
APIリクエストを行うために Buzz package を使用しました。
このパッケージを追加するには、composer.json
ファイルのrequire
セクションに追加します。
{
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リクエストを作成し、その結果を一連の配列/オブジェクトに変換することです。使用(本質的に、データストレージだけが異なります。これは、そもそもリポジトリクラスに悩まされる利点の1つです)。
Laravelではパッケージ Guzzle を使用できます。HTTPリクエストを送信するのはPHP HTTPクライアントです。
Guzzleは作曲家からインストールできます
composer require guzzlehttp/guzzle:~6.0
または、プロジェクトの既存のcomposer.jsonでGuzzleを依存関係として指定できます
{
"require": {
"guzzlehttp/guzzle": "~6.0"
}
}
以下に示すように、Guzzleを使用したlaravel 5のコード例、
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);
}
使用するものを選択できます。
file_get_contents:
$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を使用してこれを解決する方法はユーザー次第です。