わすれっぽいきみえ

みらいのじぶんにやさしくしてやる

8日目: ランキングを返すAPIの仮組みをする

laravel.com

laravel.com

laravel.com

この3つのドキュメントを見ながら簡単なAPIを作る。

まず簡単に /api/rankings/weekly というパスを叩いてレスポンスが返ってくるようにする。

routes/api.phpを以下のように書き換える。

-Route::get('/user', function (Request $request) {
-    return $request->user();
-})->middleware('auth:api');
+Route::get('/ranking/{type}', function ($type) {
+  return 'Ranking type: '.$type;
+});

これで http://localhost:8000/api/ranking/weekly を叩いてみたところが以下。

f:id:kimikimi714:20161201211328p:plain

上の差分には '/api' というパスは書いてないが、これは app/Providers/RouteServiceProvider.php

    /**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    {
        Route::group([
            'middleware' => 'api',
            'namespace' => $this->namespace,
            'prefix' => 'api',
        ], function ($router) {
            require base_path('routes/api.php');
        });
    }

で 'prefix' が予め登録されているためで、もし他のパスにしたければ上記の部分を適当に修正すれば良い。

Laravelにはcontrollerを自動生成するためのコマンドがあり、さらにResource Controllersというもので、CRUDAPIのパスの雛形を自動生成してくれる。
というわけで早速以下のコマンドを叩いてRankingControllerを作る。

$ php artisan make:controller RankingController --resource
Controller created successfully.

これでroutes/api.phpをまた書き換える。

-Route::get('/ranking/{type}', function ($type) {
-  return 'Ranking type: '.$type;
-});
+Route::resource('rankings', 'RankingController', ['only' => ['index', 'show',]]);
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class RankingController extends Controller
{
    /**
     * Show weekly rankings.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
      return response()->json([
        'type' => 'weekly',
        'rankings' => [
          [
            'rank' => 1,
            'name' => 'hoge',
          ],
          [
            'rank' => 1,
            'name' => 'hoge',
          ],
        ]
      ]);
    }

    /**
     * Show weekly / monthly / danger rankings.
     *
     * @param  string  $type
     * @return \Illuminate\Http\Response
     */
    public function show($type)
    {
      return response()->json([
        'type' => $type,
        'rankings' => [
          [
            'rank' => 1,
            'name' => 'hoge',
          ],
          [
            'rank' => 1,
            'name' => 'hoge',
          ],
        ]
      ]);
    }
}

仮組みなのでとりあえずこんな感じで作って、http://localhost:8000/api/rankings を叩いてみると

f:id:kimikimi714:20161201212515p:plain

http://localhost:8000/api/rankings/monthly なら

f:id:kimikimi714:20161201212554p:plain

おk。この次はVueにデータを渡すためにどんなJSONにするかと実際にVueにバインドしてみる。

今日はここまで。