LumenでHelloWorld

投稿日:

夜中(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
    ~ 略 ~

treeコマンド – Qiita

ビルトインサーバの起動

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 から使える機能)。
※ 移動するのが面倒であれば-tdocument 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 できたのでよしっ!!

作成者: shimabox

Web系のプログラマをやっています。 なるべく楽しく生きていきたい。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください