Lumenについて色々まとめてみた


# はじめに
[Lumen](https://lumen.laravel.com/)を触る機会があったので、その概要やlaravelとの違いなどについてまとめてみました。
ちなみにバージョンは最新の5.6を想定してます。

# Lumenとは
laravelをベースとしたマイクロフレームワーク。

- とにかく速い、軽い
- Laravelの大部分な機能が使える
- が、構成を柔軟に変更できない、パッケージの追加を考慮していないなど制約も色々とある
- 大量のトラフィックを裁く必要のあるもの、APIサーバー、ちょっとしたものなどを作ったりする際に向いてる


公式サイト
https://lumen.laravel.com/

# Lumenの始め方

色々やり方はあるみたいですが、Homesteadを利用したやり方が楽そうなので採用しました。

1. laravelの[Homestead](https://readouble.com/laravel/5.6/ja/homestead.html)をインストール

2. ```composer global require "laravel/lumen-installer"```でLumenのインストーラをダウンロード

3. ```lumen new [プロジェクト名]```でプロジェクト作成

# ディレクトリ構造

```
|-- app
|   |-- Console
|   |-- Events
|   |-- Exceptions
|   |-- Http
|   |-- Jobs
|   |-- Listeners
|   `-- Providers
|-- artisan
|-- bootstrap
|   `-- app.php
|-- composer.json
|-- composer.lock
|-- database
|   |-- factories
|   |-- migrations
|   `-- seeds
|-- phpunit.xml
|-- public
|   `-- index.php
|-- resources
|   `-- views
|-- routes
|   `-- web.php
|-- storage
|   |-- app
|   |-- framework
|   `-- logs
|-- tests
|   |-- ExampleTest.php
|   `-- TestCase.php
`-- vendor
    |-- autoload.php
    |-- bin
    |-- composer
    |-- doctrine
    |-- dragonmantank
    |-- fzaninotto
    |-- hamcrest
    |-- illuminate
    |-- laravel
    |-- mockery
    |-- monolog
    |-- myclabs
    |-- nesbot
    |-- nikic
    |-- phar-io
    |-- phpdocumentor
    |-- phpspec
    |-- phpunit
    |-- psr
    |-- sebastian
    |-- symfony
    |-- theseer
    |-- vlucas
    `-- webmozart
```



色々とスッキリしてる！

# lumenとlaravelの違い

## configディレクトリがない
lumenにはconfigディレクトリがありません。必要な設定は bootstrap/app.php 内や .env で行います。

## 使えるartisanコマンドが異なる

lumenで使えるartisanコマンドは以下の通り。

```
Available commands:
  help                Displays help for a command
  list                Lists commands
  migrate             Run the database migrations
 auth
  auth:clear-resets   Flush expired password reset tokens
 cache
  cache:clear         Flush the application cache
  cache:forget        Remove an item from the cache
  cache:table         Create a migration for the cache database table
 db
  db:seed             Seed the database with records
 make
  make:migration      Create a new migration file
  make:seeder         Create a new seeder class
 migrate
  migrate:fresh       Drop all tables and re-run all migrations
  migrate:install     Create the migration repository
  migrate:refresh     Reset and re-run all migrations
  migrate:reset       Rollback all database migrations
  migrate:rollback    Rollback the last database migration
  migrate:status      Show the status of each migration
 queue
  queue:failed        List all of the failed queue jobs
  queue:failed-table  Create a migration for the failed queue jobs database table
  queue:flush         Flush all of the failed queue jobs
  queue:forget        Delete a failed queue job
  queue:listen        Listen to a given queue
  queue:restart       Restart queue worker daemons after their current job
  queue:retry         Retry a failed queue job
  queue:table         Create a migration for the queue jobs database table
  queue:work          Start processing jobs on the queue as a daemon
 schedule
  schedule:run        Run the scheduled commands
```
laravelと違いコントローラーやモデルはartisanコマンドでは作れないので、手動で作る必要があります。

## ルーティング

記載する場所はlaravel同様`/routes/web.php`ですが、記述の仕方が異なります。

```web.php
Route::get('foo', function () {
    return 'Hello World';
});
```
laravelの場合、上記のようにRouteを利用しますが、
LumenではRouteは利用せず以下のように記述します。

```web.php
$router->get('foo', function () {
    return 'Hello World';
});

$router->post('foo', function () {
    //
});
```

## FacadeやEloquentを使う時にひと手間いる

laravelでは難なく利用できたFacade,Eloquentですが、lumenで使用する際には以下の対応が必要になります。

- Facade使いたい時は、`/bootstrap/app.php`内の`$app->withFacades()`をコメントイン。
- 同様にEloquentを使いたい時は、`/bootstrap/app.php`内の`$app->withEloquent()`をコメントイン。


## セッションが使えない
5.2以降使えなくなったそう。公式にはセッション使いたかったらlaravel使ってねって記載してあります。。
RESTを実現するための施策なんでしょうか。
[こちらの記事](https://qiita.com/mikakane/items/faa8becc85631be13156)にて回避策をまとめてくださってる方もいますが、
まぁ公式の言う通りセッション使うようであればlaravel使った方が無難なんでしょうか？

# 使ってみた所感
- laravelと共通してる部分がかなりあってlaravelを使う感覚で割と色々できる
- けどlaravel感覚で使ってるとあれ？これできないの？みたいなことに直面する。artisanコマンドとか
- エラーメッセージとかddした時のビューがlaravelと比べちょいダサ…
- 普通のCRUDアプリの実装では特にlumenはえー！すごー！みたいな感じはしなかった
- 色々シンプルになってるのはわかるけど、使いどころがいまいちわからん…
- 日本語のドキュメント少ない

色々多機能でドキュメントも充実してるlaravelをとりあえず使っちゃえばいいんじゃない？と思ってしまいますけど
軽量化目的でAPIだけの実装とかであればlumenの方が適してるんでしょうか。


# 参考

https://qiita.com/zaburo/items/68bf50f0beda65445de7
http://blog.yucchiy.com/2015/05/09/hello-lumen/
https://laravel10.wordpress.com/2015/04/20/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-lumen-%E7%99%BB%E5%A0%B4/#more-1294