夜中(3:00くらい)にスコーン、スコーンと定期的にテニスでラリーをしている様な音が聞こえてきて、こんな夜中にテニスの練習なんかするんじゃねぇーよとベランダから周りを見ても誰もいないし、外ではスコーンの音は聞こえないし、え?何だったのと思って寝床に戻るとまた聞こえてきて冷静に確認したら妻の鼻息でした。
というわけで、今回はローカルのMacでLaravelのLumenを使ってHelloWorldまでやってみたのでメモっておきます。
なんで今さらと思うかもしれませんが、簡単なAPIを趣味で作る機会があり、せっかくなので前から興味のあったLumenを使ってみようと思い立った次第であります。
といっても、ググれば laravel製軽量フレームワーク Lumen を試してみる – Qiita など、いくらでも分かりやすい記事がすぐ見つかると思います。
これらを参考にすれば大体おkなのですが、実際に試してみると微妙にハマった部分(バージョン違いによるもの)もあったので、一応自分で行った手順を書いていきます。
自分の環境
$ php -v PHP 5.6.24 (cli) (built: Aug 8 2016 16:58:37) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
手順
composerでインストールするので、未導入の人は こちら を参考にいれてみてください。
※ よろしければ Composerを久々にダウンロードしようとしたらちょっとハマった | Shimabox Blog も参考にどうぞ
インストール
$ composer global require "laravel/lumen-installer"
プロジェクト作成
$ lumen new sample-lumen
※ プロジェクト名は適宜修正してください
こんなメッセージが出たら成功です。
Crafting application... Application ready! Build something amazing.
パスが通っていない場合
$ echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' >> ~/.bash_profile $ source ~/.bash_profile
※ zshの人は.zsh_profile
なのかな
プロジェクト直下に移動してみます。
$ cd sample-lumen
こんなディレクトリ構成になっています。
$ tree -L 3 . |-- app | |-- Console | | |-- Commands | | `-- Kernel.php | |-- Events | | |-- Event.php | | `-- ExampleEvent.php | |-- Exceptions | | `-- Handler.php | |-- Http | | |-- Controllers | | `-- Middleware | |-- Jobs | | |-- ExampleJob.php | | `-- Job.php | |-- Listeners | | `-- ExampleListener.php | |-- Providers | | |-- AppServiceProvider.php | | |-- AuthServiceProvider.php | | `-- EventServiceProvider.php | `-- User.php |-- artisan |-- bootstrap | `-- app.php |-- composer.json |-- composer.lock |-- database | |-- factories | | `-- ModelFactory.php | |-- migrations | `-- seeds | `-- DatabaseSeeder.php |-- phpunit.xml |-- public | `-- index.php |-- readme.md |-- resources | `-- views |-- routes | `-- web.php |-- storage | |-- app | |-- framework | | |-- cache | | `-- views | `-- logs |-- tests | |-- ExampleTest.php | `-- TestCase.php `-- vendor |-- autoload.php ~ 略 ~
ビルトインサーバの起動
Laravelだとプロジェクト直下でphp artisan serve
を叩けばビルトインサーバが起動されますが、Lumenではserveコマンドが削除されたようです。
Why has the artisan serve command been removed from Lumen 5.2? – Stack Overflow
なので、public
ディレクトリまで移動して
$ cd public/ $ php -S localhost:8080
を叩いて起動します(PHP 5.4.0 から使える機能)。
※ 移動するのが面倒であれば-t
でdocument root
を指定できます。
$ php -S localhost:8080 -t ./public
起動すればこんなメッセージがでるはず。
PHP 5.6.24 Development Server started at Fri Oct 28 07:30:21 2016 Listening on http://localhost:8080
動かしてみる
http://localhost:8080 にアクセスしてみます。
Lumen (5.3.1) (Laravel Components 5.3.*)
と、画面に出力されれば、とりあえずおkです。
※ え、これでいいの??と思うかも(僕は思った)
どうしてもphp artisan serve
を使いたい場合
mlntn/lumen-artisan-serve: artisan serve for Lumen projects
を利用するとphp artisan serve
が使えます。
- インストール (composer.jsonがあるディレクトリで)
composer require mlntn/lumen-artisan-serve "~1"
- 以下ファイルの修正
sample-lumen/app/Console/Kernel.php
<?php namespace App\Console; use Illuminate\Console\Scheduling\Schedule; use Laravel\Lumen\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ \Mlntn\Console\Commands\Serve::class ]; /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { // } }
$commandsに\Mlntn\Console\Commands\Serve::class
を追記します
こうすると、プロジェクトディレクトリ直下 (artisanがあるところ) でいつものこれが使えます。
$ php artisan serve --port=8080
※ –portを指定しないと8000ポートになります
それか、
- https://github.com/laravel/laravel/blob/master/server.php
- https://github.com/laravel/framework/blob/5.2/src/Illuminate/Foundation/Console/ServeCommand.php
を持ってきても叩けるようです。
※ これは試していません
HelloWorldしてみる
これで大体おkなのですが、一応画面にHello World!!
と出力してみます。
修正するのは以下ファイルです。
sample-lumen/routes/web.php
- ルーティングを管理するファイルです
- このURLにきたら、このプログラムを動かせ!みたいな命令を記述しておくところです
- デフォルトでは、
/
の時、つまり http://localhost:8080 (ベースのURL) にアクセスされたときの挙動が定義されています
<?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) { return $app->version(); });
を、
<?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) { return 'Hello World!!'; });
こうします。
変更したら、http://localhost:8080 にアクセスしてみます。
Hello World!!
と、画面に出力されたらOKです。
余談
変更前の、$app->version();
で何が出力されているか見てみると、、
※ $app はLaravel\Lumen\Application
オブジェクトです
sample-lumen/vendor/laravel/lumen-framework/src/Application.php
class Application extends Container { // 略 /** * Get the version number of the application. * * @return string */ public function version() { return 'Lumen (5.3.1) (Laravel Components 5.3.*)'; } }
最初に、Lumen (5.3.1) (Laravel Components 5.3.*) と表示されるのは無問題というのが分かります。
その他設定
ここまでで当初の目的であるHelloWorld出力計画は完了しているのですが、今後の事を考えてやっておいたほうがいいかも的な事を書きます。
.env ファイルの作成
Lumen(というかLaravel、というか最近のフレームワーク)は設定情報を.envファイルから取得しますので、このファイルを作ります。
プロジェクト直下に.env.example
ファイルがあるので、それをコピーして.env
にします。
$ cp .env.example .env
中身はこんな感じ。
APP_ENV=local APP_DEBUG=true APP_KEY= APP_TIMEZONE=UTC DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret CACHE_DRIVER=memcached QUEUE_DRIVER=sync
ここで大事なのはとりあえず、APP_XXX
なのでそちらの設定をします。
※ それ以外(DBとか)の設定は必要な時に直せばいいと思います
APP_ENV
今どの環境なのかを決定するための値です。
基本的には以下の種類があるかと思います。
※プロジェクトによって変わってくると思います
- local
- ローカル開発環境
- staging
- ステージング環境 (本番デプロイ前の確認環境)
- production
- 本番環境
- testing
- テスト実行時(PHPUnitなど)の環境
Laravel\Lumen\Testing\TestCase
を継承したクラスからテストを実行する場合、明示する必要はありません
開発中はlocal
で行うことが多いと思います。
APP_DEBUG
ここの値がtrue
だと、エラーが発生した時にエラー情報(stack trace)を画面に表示してくれます。
逆に、ここの値がfalse
だと、エラーが発生してもエラー情報(stack trace)は画面に表示されません。
万が一の時エラー情報が丸見えだと、こっ恥ずかしいし脆弱性にも繋がるので 本番環境ではAPP_DEBUGはfalseにします。
APP_KEY
ユーザーのセッション情報やパスワードの暗号化等をセキュアにする為に必要になる値です。
Laravelの場合、php artisan key:generate
をすると、APP_KEYを生成してくれますがLumenだと使えなくなっているようです。
その為、以下手順などでAPP_KEYを生成して設定します。
- sample-lumen/routes/web.php を修正
$app->get('/', function () use ($app) { return str_random(32); // return $app->version(); });
- http://localhost:8080 にアクセス
zKcGxb2FVHIUr2UQntwdk1i3lxt2w9zz
こんな感じで32文字のランダム文字が表示されるのでコピーします- コピーした文字列を
APP_KEY=zKcGxb2FVHIUr2UQntwdk1i3lxt2w9zz
のように設定します - 設定が終わったら上記で修正した
sample-lumen/routes/web.php
は元に戻しておきます
APP_TIMEZONE
APP_TIMEZONEは、 APP_TIMEZONE=Asia/Tokyo
に変更します。
そうしないと、
// 2016-11-05 07:51:33 に実行しています echo (new DateTime())->format('Y-m-d H:i:s'); // 2016-11-04 22:51:33 と表示される
このようにタイムゾーンがずれた状態になってしまいます。
ディレクトリのパーミッション変更
デフォルトだとsample-lumen/storage/*
にログファイル(logs/)やその他諸々などが吐き出されます。
上記ディレクトリ以下にWebサーバの実行ユーザ(apacheとか)からの書き込みが行われるので、適切なパーミッションを設定したほうがいいです。
(ローカルなどでやっている場合、そんなに問題ないと思いますが)
一応確認
sample-lumen/routes/web.php を以下のように修正してみて、
$app->get('/', function () use ($app) { echo $app; // わざとエラーにする // return $app->version(); });
sample-lumen/storage/logs/lumen.log
が出力されていれば大丈夫。
出力されていなければ書き込み許可が無いのでsample-lumen/storage/*
に、パーミッションを設定してください。
セキュリティ的に問題なければ以下コマンドで全ユーザーの操作を許可するのもありです。
chmod -R 777 sample-lumen/storage/*
まとめ
ざっくりですがこんな感じです。
Laravelでは使えるのに使えないコマンドがあってちょっと躓きました。
特にartisan key:generate
が使えないとかね。
(なんだろ、特にAPP_KEYを使うようなユースケースをあまり想定していないんだろうか。。)
まぁ、とりあえず Hello World できたのでよしっ!!