この記事はLaravelアドベントカレンダーの13日目として書かれています。
最近Laravel製のマイクロフレームワークLumenを使って個人的な開発をしています。
その時にこれしたいんだけど、どうやるの?みたいなことを思ったタイミングが何度か合ったので、それをまとめようと思います。
目次
下記のことについて触れようと思います。
ほんとはLumenからLaravelに移行したい時にどうすればよいのかとかも検証したかったのですが、Laravel力が足りなかったので割愛しました。
- lumenコマンドを使わずにプロジェクトを作成する方法
- debugをオンにする方法
- Laravel用のプラグイン利用時にconfigを置く場所について
- テンプレートエンジンにtwigを使う方法
- 自前のクラスを置く場所について
lumenコマンドを使わずにプロジェクトを作成する方法
lumenコマンドを利用せず特定のディレクトリにLumenプロジェクトを作成する方法です。
composer create-projectコマンドを利用すれば簡単でした。
Installation - 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エラーのページが表示されるのみ。
ビルトインサーバ側も特に何も言ってくれません。
$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となっていればデバッグがオンになります。
こんな感じ
Laravel用のプラグイン利用時にconfigを置く場所について
Laravelのプラグイン等をインストールし、設定を上書きして変えたい時、configディレクトリにその設定を書けば良いと思うのですが、初期状態のLumenにはconfigディレクトリがありません。
Document見るとなにか書いてあります。
http://lumen.laravel.com/docs/installation のConfiguration 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
これでプラグインの設定を上書きすることが出来ます。
自前のクラスを置く場所について
自前のクラスをどこに置けば良いのかふと悩んだのでその時のメモです。
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の方はあまり触ってないので、そちらの方も触っていきたいなーと思った日でした。