laravel製軽量フレームワーク Lumen を試してみる


# 追記3

別途検証していた際に記事に記載漏れがあったので追記しました。

post のリクエストの箇所で、Requestを利用するためには、```bootstrap/app.php```の```$app->withFacades();```をコメントインする必要があります。

# 追記2

getとpostだけでは実用的ではないので、ORMとMigrationを触ってみた記事を書いたので見ていただければと思います。

[Laravel製 軽量フレームワーク Lumen　ORMとMigrationを触ってみる](http://qiita.com/yaaamaaaguuu/items/17bdc7e1e664fa74d059)

# 追記

@shin1x1 さんから以下の様にコメントを頂いたのでサーバー起動に関して記事を修正しました。
> Lumen（Laravel）には、ビルトインサーバを起動するコマンドがあるので、こちらを利用すると良いです。

```
$ php artisan serve
```

# 趣旨
laravelから軽量フレームワークの [Lumen](http://lumen.laravel.com/)と言うのが出たらしいのでとりあえず、get,postとテンプレートエンジンのbladeを試してみるところまでやってみる。

# Lumenの概要

phpの軽量フレームワーク[slim](http://www.slimframework.com/)や[silex](http://silex.sensiolabs.org/)とかの競合フレームワークとのことらしい。

phpのslimとかを知らない人向けに話すと、rubyでいうところの[sinatora](http://www.sinatrarb.com/)とかpythonの[flask](http://flask.pocoo.org/)みたいなフレームワークということになる。

# Lumenを採用する利点



トップページから

* slimやsilexよりベンチマークで良いスコアが出ている
* プロジェクトの規模が大きくなった際、laravelへの移行が簡単

ドキュメントの[イントロダクション](http://lumen.laravel.com/docs/introduction#what-is-lumen)から

* Laravelのアプリを切り分けるのに使えるよ
* Laravelと同様の機能(ORM,テンプレートエンジン)が使えるよ


つまり、大きくなるかもしれないけど小さく始めたいプロジェクトや、様々な事情からLaravelを分割したいプロジェクトに利用するフレームワークの選択肢になるよ！ということがドキュメントから読み取れる



# 必要要件

* PHP >= 5.4
* Mcrypt PHP Extension
* OpenSSL PHP Extension
* Mbstring PHP Extension
* Tokenizer PHP Extension

# install

[composer](https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx)を利用してください。

```
#環境によっては php composer になったりすると思います。適宜読み替えてください。
composer global require "laravel/lumen-installer=~1.0"
```

# Lumenの始め方

lumenコマンドのパスが通っていれば以下のコマンドで。

```
lumen new service
```

成功すると以下の様なディレクトリ構成になる

```
.
├── composer.json
├── composer.lock
├── service
    ├── app
    │   ├── Console
    │   ├── Exceptions
    │   ├── Http
    │   ├── Jobs
    │   └── Providers
    ├── artisan
    ├── bootstrap
    │   └── app.php
    ├── composer.json
    ├── composer.lock
    ├── phpunit.xml
    ├── public
    │   └── index.php
    ├── readme.md
    ├── server.php
    ├── storage
    │   ├── app
    │   ├── framework
    │   └── logs
    ├── tests
        ├── ExampleTest.php
        └── TestCase.php
```



# とりあえず動かす

slimなどと同様の利用方法は```service/app/Http/routes.php```をいじるとのこと

初期状態では以下の様なコードが```routes.php```に記述されている

```php
<?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/

$app->get('/', function() use ($app) {
	return $app->welcome();
});

```

とりあえず起動してみる。

**修正箇所**

``` service ```　ディレクトリ以下で下記の様にコマンドを叩くとサーバーが起動します。


```
php artisan serve

#指摘前はportを8080番で動かしていましたが、serveコマンドは8000番で動きます。
# portを指定するには --portを利用します。
# php artisan serve --port=8080
```

---
修正前記事です。

php5.4以上？であれば、ビルトインサーバーが利用できるので、```service```ディレクトリ以下の```server.php```を利用して以下のコマンドをたたき、localhost:8080にアクセスする。

```
php -S 127.0.0.1:8080 server.php

#上記の方法だと、エラーが出た瞬間にログを吐き出す際の設定上の問題で上手くいかないので、appディレクトリの中でいっこ下の階層のserver.phpを叩く形式にしたほうがいいのかもしれない。
# appディレクトリ内で
# php -S 127.0.0.1:8080 ../server.php
```
---
すると以下の様な画面になる。

![Lumen.png](https://qiita-image-store.s3.amazonaws.com/0/10992/44ba5b3c-7bfd-ef6d-f11c-270de5b77fdf.png "Lumen.png")

シンプル！

# Get Requset

routes.phpに以下を追記

getメソッドの第一引数にulr。この際に```{}```でくくったものがパラメータになり、無名関数の引数としてあげることで利用できる。

```
$app->get('/{name}', function($name) {
	return "Hello $name";
});

```

先ほどと同じようにビルトインサーバーを起動して、http://localhost:8080/hogehoge とアクセスすると```Hello hogehoge```と帰ってくるのが分かる。

# Post Request

routes.phpに以下を追記。

```
# Requestクラスを使うからと言って、routes.phpに何かをuseする必要はない。
$app->post('/',function() use($app){
    $data = Request::all();
    return json_encode($data);
});
```

#追記3

```bootstrap/app.php``` の20行目の以下をコメントインする必要があります。

```
$app->withFacades();
```

追記終了

---

postの値はRequestのメソッドで取得できる。

とりあえず、postした値が全てjsonの形式で帰ってくるようにしてみた。同様にサーバーを起動し、

```
curl -F "name=hogehoge" http://127.0.0.1:8080/
```

この様な形式でコマンドを叩くと,

```
{"name":"hogehoge"}
```

と帰ってくる。

# Viewを利用する

最初に、```app```ディレクトリと同じ階層に、````resources```ディレクトリをつくり、その子ディレクトリとして```views```ディレクトリを作成する。

そのディレクトリがテンプレートを配置する基本的なディレクトリとなる。

ここではindex.phpを以下のように作成してみる。

```php
<h1><?php echo $name;?</h1>
```

のちに、Get Request で追記した箇所を変更してみる

```diff
$app->get('/{name}',function($name) use($app){
-    return "Hello $name";
+    return view("index",["name"=>$name]);
});
```

そして同様にサーバーを起動し、http://localhost:8080/hogehoge にアクセスると、h1タグで囲まれたhtmlがリクエストとして帰ってくる。

# テンプレート

laravel製ということもあり、bladeテンプレートエンジンが利用できる。

先ほどのindex.phpを書き換えて名前を変更する

```index.php``` => ```index.blade.php```

```diff
- <h1><?php echo $name;?</h1>
+ <h1>{{$name}}</h1>
```

先ほどと同じようにアクセスしてみると同じ結果が帰ってくる。

# 軽く触ってみて思ったこと

* slimとtwigと~とかで始めるより、lumenの方がひとしきり揃っているので楽なのかもしれない。
* ところどころでlaravelの知識を求められる感がある。
* アイコンがおしゃれだよね。

敷居は低いと思うので、みなさんも触ってみたらいいと思います。