Lumen活用

これは Laravelリファレンス発売記念、販売促進アドベントカレンダー www.adventar.org の2015年12月18日分です。

今回は書籍では取り上げていませんが、Lumenについてです。 弊社のAPIでもLumen(とgolang)を活用していたりします。

Lumenおさらい

LumenはLaravelのilluminateコンポーネントを組み合わせて構成されているフレームワークで、
マイクロフレームワークともいわれていますが、多くの機能を有していて、
通常のフレームワークと言っても差し支えないのかもしれません。

Laravelとの違いは

  • RouterはfastRouteを利用
  • configなどは必要なものしか読み込まない(コンテナから取得時に読み込まれる)
  • サービスプロバイダは単純にコンテナに登録するのみ
  • ファサードを利用するかしないか選択可
  • APP_KEY生成コマンドなし

ぐらいでしょうか。

簡単な使い方はブログに書かれている方や、公式マニュアルを見るだけで十分理解できると思います。

.env使う場合

bootstrap/app.phpで忘れずにDotenv::loadのコメントアウトを外しておきましょう。

<?php

require_once __DIR__.'/../vendor/autoload.php';

\Dotenv::load(__DIR__.'/../');

.envを利用しない場合は、Laravelと同じように $value = getenv($key); が先に動きますので、
webサーバやphp-fomなどで環境変数を利用できます。
複数台構成の場合は.envで管理するよりもサーバなどで環境変数と組み合わせた方が事故が少ないと思います。

タイムゾーン変更

アプリケーションクラスでAPP_TIMEZONEを利用していますので、
必ず利用したいタイムゾーンを.envまたはsetEnvなどで指定しておきましょう。

APP_TIMEZONE=Asia/Tokyo

アプリケーションクラス継承

アプリケーションに合わせてアプリケーションクラスを継承する場合が多いでしょう。

利用しない機能はLaravel同様に除外できます。
$availableBindingsプロパティを上書きしてコンパクトにすることができます。
Laravel同様いらないものを削除していきましょう。

ルータキャッシュ

Lumenはルータのディスパッチャを変更できますので、fastRouteのキャッシュルータに変更してみましょう。
bootstrap/app.phpなどを利用するといいでしょう。

<?php 

$app->setDispatcher(FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $r) use ($app) {
    /** @var \Laravel\Lumen\Application $app */
    foreach ($app->getRoutes() as $route) {
        $r->addRoute($route['method'], $route['uri'], $route['action']);
    }
}, [
    'cacheFile' => storage_path('route.cache'),
]));

ルータにクロージャを利用している場合は利用できませんので注意しましょう。
キャッシュファイルがある場合は/app/Http/routes.phpを読み込まないようにするなどしておきましょう

artisanコマンド削除

デフォルトで用意されているコマンドを利用しない場合は、簡単に除外できます。
App\Console\Kernelクラスの$includeDefaultCommandsプロパティを利用しましょう。

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /** @var bool  */
    protected $includeDefaultCommands = false;
    
    // 省略

綺麗に書く

ファサードを使わずに、データベースなどを綺麗に利用したい場合はサービスプロバイダを利用しましょう。
簡単な例を紹介します。

<?php

namespace App\Repositories;

interface CacheRepositoryInterface
{

    /**
     * @return mixed
     */
    public function getHoge();
}
<?php

namespace App\Repositories;

use Illuminate\Cache\CacheManager;

class CacheRepository implements CacheRepositoryInterface
{
    /** @var CacheManager  */
    protected $cache;

    /**
     * CacheRepository constructor.
     *
     * @param CacheManager $cache
     */
    public function __construct(CacheManager $cache)
    {
        $this->cache = $cache;
    }

    /**
     * @return mixed
     */
    public function getHoge()
    {
        return $this->cache->driver()->get('hoge');
    }
}

Laravelではこのまま動作せることができますが、
Lumenの場合は、CacheManagerの依存を自動で解決できません。
コンテナからcacheを取得してコンフィグなどを読み込ませます。

サービスプロバイダ例

    public function register()
    {
        $this->app->bind('App\Repositories\CacheRepositoryInterface', function ($app) {
            return new CacheRepository($app->make('cache'));
        });
    }

あとは利用したいクラスなどでコンストラクタインジェクションなどを使いましょう。
LaravelでもLumenでも、どんなものでも再利用できるようになります。