LoginSignup
23
22

More than 5 years have passed since last update.

LumenでDBと連携した簡単なapiを作ってみる

Last updated at Posted at 2017-06-12

The stunningly fast micro-framework by Laravel.

LumenはLaravelの小さい版です.
Laravelはフルスタックなフレームワークであるのに対し,Lumenはマイクロフレームワークです.

いくつかあるPHPフレームワークの中でLaravelがいいなぁっていう理由はLaravelの環境構築からちょっと動かすまでの話で少し書きました.

ただ,簡単なアプリケーションや,apiを作成し,実行するにはちょっと重いなぁっていうのがよく言われてる話でした.

そこでLaravelらしさたっぷりの軽量なLumenを試してみよう!というわけです.

環境

項目 バージョン
OS macOS Sierra ver.10.12.5
php 5.6

前提

Composerが入っている
入ってない人はこちらの記事を参考にしてください.

導入

Lumen入手
composer global require "laravel/lumen-installer"

実装

プロジェクト作成

作成
$ composer create-project --prefer-dist laravel/lumen news

Laravelのプロジェクト作成とほぼ一緒です.
ちなみになんですが,これはプロジェクト名がnewsということです.

環境設定

Laravelではプロジェクト作成の際に.envファイルが作成されるが,Lumenでは作成されないので,.env.exampleをコピーするところから始めましょう.

.env
APP_ENV=local
APP_DEBUG=true
APP_KEY=SomeRandomKey!!!

### ここを適宜変更!
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
###

CACHE_DRIVER=memcached
QUEUE_DRIVER=sync

### ここもあとで使う
VERSION=v1

MySQLからニュースに関する情報を持ってくることにします.
今回使用するデータベースの名前はnewsとしました.

DBのMigration

ターミナルから

$ php artisan make:migration create_articles_table --create=articles

すると,database/migrationsタイムスタンプ_create_articles_table.phpが作成されます.

そのファイルをちょこっと編集

database/migrations/2017_06_12_131529_create_article_table.php
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateArticleTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
       //ここ追加!
            $table->string('title');
            $table->text('contents');
       //
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('articles');
    }
}

Migrationする(ターミナルから)

$ php artisan migrate
Migration table created successfully.
Migrated: 2017_06_12_131529_create_article_table

DBを見てみると,

テーブル確認
mysql> show tables;
+----------------+
| Tables_in_news |
+----------------+
| articles       |
| migrations     |
+----------------+
2 rows in set (0.00 sec)

入ってますね.
ダミーデータをSeedするやり方もLumenには用意されてますが,今回はとりあえずこのままDBからinsertしちゃいます.

入れました.

データ挿入後
mysql> select * from articles;
+----+--------+-----------+------------+------------+
| id | title  | contents  | created_at | updated_at |
+----+--------+-----------+------------+------------+
|  1 | title1 | contents1 | NULL       | NULL       |
|  2 | title2 | contents2 | NULL       | NULL       |
|  3 | title3 | contents3 | NULL       | NULL       |
+----+--------+-----------+------------+------------+
3 rows in set (0.00 sec)

しまった...
titleとcontentsしかinsertしてないからtimestampのところがnullになってしまった....
このまま行きますwww

Seedとかアプリケーションからの挿入だとちゃんと入ります.

エンドポイント決める

Routingに関しては,app/Http/routes.phpに記述
今回は記事一覧とその記事の詳細を見れるapiを作ることにします.(今回はgetするだけですすみません..)

app/Http/routes.php
<?php

$app->get(env('VERSION').'/articles', 'ArticleController@get');

$app->get(env('VERSION').'/articles/{id}', 'ArticleController@getById');

$app->get(env('VERSION').'/articles', 'ArticleController@get');v1/newsというアクセスに対して,app/Http/controllers/ArticleControllergetメソッドを実行するということです.

env()は前に色々記述した.envファイルの中身を参照するものです.
key:VERSIONのvalueはv1でしたよね.

モデル作成

Article.php
<?php
/**
 * Created by PhpStorm.
 * User: shu920921
 * Date: 2017/06/12
 * Time: 22:22
 */

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{

    protected $table = 'articles';
}

ぶっちゃけこれなくてもなんとかなる.
あとでORMとしてEloquentを用いるのですが,モデルがあった方がわかりやすいので..

デフォルトだとArticleモデルにはDBのarticlesテーブルの中身がマッピングされる?みたいです.
なのでここの記述はモデル名とテーブル名が異なるときとか,フィールドとDBのカラム名・カラム数が異なる場合とかにいろいろ記述する感じですかね.

ORMを使用する

bootstrap/app.phpにて,$app->withEloquent();のコメントアウトを外す.それだけ.

Controllerの作成

app/Http/Controllers/ArticleController.php
<?php
/**
 * Created by PhpStorm.
 * User: shu920921
 * Date: 2017/06/12
 * Time: 21:58
 */

namespace App\Http\Controllers;

use App\Article;

class ArticleController extends Controller
{
    public function get()
    {
        $articles = Article::all();
        return response()->json($articles);
    }

    public function getById($id)
    {
        $article = Article::find($id);
        return response()->json($article);
    }
}

$articles = Article::all();らへんがEloquentを使用したところです.
いろいろ使い方がありそうなので詳しくはEloquentを参照して頂きたいです.

Responseに関してですが,Lumen公式とか色々見たけどこういう書き方してるのはなかった気がするからもしかして間違ってるかもしれないっす

実行!

$ php -S localhost:8000 -t public

記事一覧:
http://localhost:8000/v1/articles

記事一覧
[{"id":1,"title":"title1","contents":"contents1","created_at":null,"updated_at":null},{"id":2,"title":"title2","contents":"contents2","created_at":null,"updated_at":null},{"id":3,"title":"title3","contents":"contents3","created_at":null,"updated_at":null}]

記事詳細:
http://localhost:8000/v1/articles/1

記事詳細
{"id":1,"title":"title1","contents":"contents1","created_at":null,"updated_at":null}

responseの返し方は怪しかったが無事動いている.

23
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
22