web-dev-qa-db-ja.com

Laravel=からデータを取得するREST API

わかりましたので、次の状況があります。

私が構築しているシステムは、REST apiからデータを取得し、そのデータをデータベースに保存しています。どのようにこれを実装でき、このような動作はLaravels構造(コントローラ、モデルなど)?Laravelは外部ソースからデータを取得するためのメカニズムを内蔵していますか?

27
Tomkarho

まず、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リクエストをフロントエンドとして使用できます。

9
devo

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つです)。

42
fideloper

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);

}
24
Mohammed Safeer

使用するものを選択できます。

  1. ガズル
  2. CURL
  3. file_get_contents:

    $json = json_decode(file_get_contents('http://Host.com/api/v1/users/1'), true);
    

参照元

6
tsveti_iko

外部APIのマニュアルをご覧ください。そこには、情報を取得する方法に関する情報があります。

次に、最善の計画はインターフェイスを構築することです。これをチェックしてください: http://culttt.com/2013/07/08/creating-flexible-controllers-in-laravel-4-using-repositories/

Phpを使用してこれを解決する方法はユーザー次第です。

2
Skid Kadda