日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

Laravel製マイクロフレームワークLumenを使おうとして困ったこととその解決策

この記事はLaravelアドベントカレンダーの13日目として書かれています。

www.adventar.org

最近Laravel製のマイクロフレームワークLumenを使って個人的な開発をしています。
その時にこれしたいんだけど、どうやるの?みたいなことを思ったタイミングが何度か合ったので、それをまとめようと思います。

目次

下記のことについて触れようと思います。
ほんとはLumenからLaravelに移行したい時にどうすればよいのかとかも検証したかったのですが、Laravel力が足りなかったので割愛しました。

  • lumenコマンドを使わずにプロジェクトを作成する方法
  • debugをオンにする方法
  • Laravel用のプラグイン利用時にconfigを置く場所について
  • テンプレートエンジンにtwigを使う方法
  • 自前のクラスを置く場所について

lumenコマンドを使わずにプロジェクトを作成する方法

lumenコマンドを利用せず特定のディレクトリにLumenプロジェクトを作成する方法です。
composer create-projectコマンドを利用すれば簡単でした。
Lumen - PHP Micro-Framework By Laravel

$php -r "readfile('https://getcomposer.org/installer');" | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /path/to/composer.phar
Use it: php composer.phar

$php composer.phar create-project laravel/lumen my_project_dir
Installing laravel/lumen (v5.1.4)
  - Installing laravel/lumen (v5.1.4)
    Loading from cache

Created project in my_project_dir
Loading composer repositories with package information
Installing dependencies (including require-dev)
...
$tree -L 2
.
├── composer.phar
└── my_project_dir
    ├── app
    ├── artisan
    ├── bootstrap
    ├── composer.json
    ├── database
    ├── phpunit.xml
    ├── public
    ├── readme.md
    ├── resources
    ├── server.php
    ├── storage
    ├── tests
    └── vendor

9 directories, 6 files

debugをオンにする方法

Lumenは初期状態だとデバッグがオフになっています。
なので例えば下記のようにしょうもないミスをしていたりするときにLumenを実行したとしても500ページが出るだけで、何が起こっているのか全くわかりません。

<?php

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

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

アクセスしたとしてもこのように500エラーのページが表示されるのみ。

f:id:arata3da4:20151213220445p:plain

ビルトインサーバ側も特に何も言ってくれません。

$php artisan serve
Lumen development server started on http://localhost:8000/

これを切り替えるために .envファイルを利用します。
参考 http://lumen.laravel.com/docs/errors

$cd /path/to/my_project_dir
$ls -a
.             .gitignore    bootstrap     database      readme.md     storage
..            app           composer.json phpunit.xml   resources     tests
.env.example  artisan       composer.lock public        server.php    vendor
# この.env.exampleをコピーして利用します。
$cp .env.example .env

よしこれでデバッグがオンになるぜ。って思うじゃないですか。
実はならないです。
理由はこのenvファイルを読みに行くという設定がbootstrap/app.phpコメントアウトされているからです。

$head -n 10 /path/to/my_project_dir/bootstrap/app.php
<?php

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

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

/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------

このDotenv::load(__DIR__.'/../');のコメントアウトを外すと.envファイルを読みに行くようになり、APP_DEBUGがtrueとなっていればデバッグがオンになります。
こんな感じ

f:id:arata3da4:20151213221542p:plain

Laravel用のプラグイン利用時にconfigを置く場所について

Laravelのプラグイン等をインストールし、設定を上書きして変えたい時、configディレクトリにその設定を書けば良いと思うのですが、初期状態のLumenにはconfigディレクトリがありません。
Document見るとなにか書いてあります。
http://lumen.laravel.com/docs/installationConfiguration Filesあたり
なるほど、勝手に足せばよいみたいです。
次の「テンプレートエンジンにtwigを使う方法」でtwigbridgeというプラグインを使うのですが、その場合だとこんな感じになりました。

$cd /path/to/my_project_dir
$mkdir config
$ls
Makefile      bootstrap     composer.phar phpunit.xml   resources     tests
app           composer.json config        public        server.php    vendor
artisan       composer.lock database      readme.md     storage
$cp ./vendor/rcrowe/twigbridge/config/twigbridge.php ./config/
$ls ./config
twigbridge.php

これでプラグインの設定を上書きすることが出来ます。

テンプレートエンジンにtwigを使う方法

よーく考えてみたら、昔記事書いてました。
わりとまじめに書いたのでこちらを参考に・・・

arata.hatenadiary.com

自前のクラスを置く場所について

自前のクラスをどこに置けば良いのかふと悩んだのでその時のメモです。
autoloaderの設定がどうなっているかがわかれば良いので、composer.jsonを見れば良さそうですね。

$cat composer.json
{
    "name": "laravel/lumen",
    "description": "The Laravel Lumen Framework.",
    "keywords": ["framework", "laravel", "lumen"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.5.9",
        "laravel/lumen-framework": "5.1.*",
        "vlucas/phpdotenv": "~1.0"
    },
    "require-dev": {
        "phpunit/phpunit": "~4.0",
        "fzaninotto/faker": "~1.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/"
        ]
    },
    "autoload-dev": {
        "classmap": [
            "tests/"
        ]
    },
    "config": {
        "preferred-install": "dist"
    }
}

autoloadの項目を見る限りappディレクトリ以下を見るようになっているので、そこに置けば良さそうです。
app/Hoge/Foo.phpというファイルを置いてみました。

<?php

namespace App\Hoge;

class Foo {
    public static function hello() {
        return "hello namespace";
    }
}

app/Http/routes.phpを編集して動くか確認してみます。

$cat app/Http/routes.php
<?php

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

$app->get('/', function () use ($app) {
    $m = \App\Hoge\Foo::hello();
    var_dump($m);
});
$php artisan serve &
[1] 43243
Lumen development server started on http://localhost:8000/

$curl localhost:8000
string(15) "hello namespace"

呼べている様子でした。

まとめ

Lumen使ってみて、なんか困ったことをまとめてみました。
.envファイルデフォルトで読みにいかないんかいとかconfigディレクトリ作らないといけないんかいとか思ったりしましたが、そこまでやりたいならLaravel使えよってメッセージなんですかね。
Laravelの方はあまり触ってないので、そちらの方も触っていきたいなーと思った日でした。