PHPフレームワークLaravel とLumenの特徴比較

PHPフレームワークLaravel とLumenの特徴比較

今回は2つのPHPフレームワークLaravelとLumenの違いについて解説します。Laravelは近年人気が高まっている高機能なフレームワーク、LumenはLaravelを元にマイクロサービスアーキテクチャを実現するために開発されました。

Laravel

Laravelは、オープンソースのWeb開発用PHPフレームワークです。Taylor Otwell氏によって作成され、MITライセンスの下で無償で提供されています。2011年6月にリリースされました。理解しやすく高機能で堅牢なMVC (Model View Controller) フレームワークとして近年人気が高まっています。Laravelは認証機能やバリデーション機能、DB構築支援、堅牢なセキュリティ機能など一般的なWebアプリケーションに必要とされる機能をモダンな設計思想で実装しており、開発者がサービスの開発に集中できるような工夫がなされています。

Lumen

Lumenは、Laravelの生みの親であるTaylor Otwellによって生み出されたマイクロサービス用フレームワークです。Lumenフレームワークの基礎設計はLaravelと同様のもので、Laravelで提供される重要なコンポーネントのほとんどを備えています。一方でLumenは、Webアプリケーションを構成する際に、より少ない設定とシンプルなルーティングパラメータで利用可能で、より小さく、シンプルで、無駄のない、高速な開発を行うことができます。主にマイクロサービスの構築に使用され、疎結合コンポーネントを作成するために複雑さを軽減し、簡単に改良を加えることができるように設計されています。

LaravelとLumenのより詳しい比較

まず、何を比較するのかを明確にします。もし、あなたがMVCのウェブサイトやシステムを構築していて、テンプレートを使って直接ページをレンダリングし、セッションの状態情報を保持する必要があるなら、Laravelを使うしかありません。Lumenはそれらをサポートしていません。

Lumenは、そもそも、ステートレスAPIを構築するためのものです。そしてそれはLaravelでも実現することができます。そこで両方のフレームワークができること(ステートレスAPIを提供すること)のみを比較することにします。

違い1:Viewテンプレートエンジン

LaravelはテンプレートにBladeを使用していますが、Lumenはテンプレートエンジンを持っていません。
通常のWEBアプリケーションを構築する場合テンプレートエンジンは非常に重要ですが、ステートレスAPIを提供する場合はそもそもテンプレートは全く必要ないため、その場合大きな差異はありません。

違い2:セッションエンジン

Lumenはステートレスで動作するように設計されているため、セッションを処理する機構はありません。一方でLaravelには、強力なセッションマネージャーがあります。この比較についても、ステートレスAPIを構築する場合、Laravelのセッションエンジンは利用しないため、大きな問題はありません。(テンプレートと同様)

違い3:ルーティング

Laravelのルーティングメカニズムは実に強力です。リソースルートを作成し(CRUD操作のすべてのルートを一度に作成)、ルート上で渡された値に基づいてEloquentモデルを変数に自動的にバインドすることができます(リソースが見つからない場合のエラーメッセージも返します)。これにより、開発者はコントローラのコードを非常にクリーンでエレガントに保つことができるようになります。

ルートの定義自体もかなり分かりやすく記述することが可能です。Laravelルーターはルートキャッシングもサポートしており、ルーティングのスピードを大幅に向上させます。一方で、Laravelのルーティングメカニズムは高機能であるがゆえに、キャッシュを有効にしたとしてもそれほど高速ではありません。

Lumenにはよりシンプルで高速なサードパーティルーターが搭載されています。Lumenのルーターは、自動的なモデルバインディングをサポートしておらず、キャッシュもサポートしていません(それでも速いので大きな問題ではありません)。

ここで問題なのは、速度と引き換えに素晴らしい機能(自動的なモデルバインディング)を放棄していることです。このように、スピードの向上がこの機能の緩みに見合うかどうかを考える必要があります。

違い4:フォームリクエスト

フォームリクエストは、Laravelがリクエストのボディを表現し、その検証ロジックを保持するために使用する構造体です。当初はHTMLフォームをミラーリングするために設計されましたが(だから名前がフォームリクエストなのです)、あらゆるリクエスト(RESTリクエストボディを含む)に使用することができます。これらの構造体がバリデーションを担当し、失敗したときにはバリデーションエラーのレスポンスを返します (エラーコード、レスポンスペイロード、エラーメッセージ)。すべてはコントローラを叩く前に。あなたがしなければならないことは、フォームのリクエストクラスにリクエスト変数をタイプヒントすることだけです。また、Laravelにはサニタイズエンジンが組み込まれていませんが、バリデーションに加えて、リクエストのサニタイズ機能を提供するサードパーティーライブラリーを使えば、簡単に拡張することが可能です。こうすることで、コントローラにヒットするすべてのデータが有効であることを信頼でき、コントローラのコードが非常にクリーンになります。

Lumenはフォームリクエストをサポートしていません。これは、上で示したルーターの違いに関連しています(フォームリクエストにリクエストボディを自動的にバインドすることができません)。データの検証やサニタイズはすべてコントローラ内部で行う必要があります。

違い5:Eloquent

どちらのフレームワークもEloquent(LaravelのORMエンジン)をサポートしていますが、Lumenのみ完全に無効にすることが可能です(デフォルトでは無効になっています)。
これは複雑な議論です。MVCフレームワークについて語るとき、ORMは極めて連関の高い事柄です。通常、MVCフレームワークを使用する場合、ORMはMVCで獲得した敏捷性の最大の源泉の1つであるため、ORMを希望します。もちろん、SQL文を直接データベースに送ることは、ORMエンジンを使うよりもパフォーマンスが高いです。しかし、リレーションシップやキャストそれに付随するすべてのことについて処理を記述することは非常に大変ですし、保守性にも優れません。
機能を無効化することは可能ですがほとんどの場合、Lumenを使ってもEloquentを使いたいでしょう。Eloquentがなければ、フレームワークを利用するメリットはかなり薄まってしまうからです。また、SymfonyのORMエンジン(Doctrineベース)が非常に遅かったため、EloquentはLaravelを完全に一から書き直したピースの1つです。Laravel は Symfony をベースにしており、多くの Symfony コンポーネントが使われています)。

違い6:Facades

この比較では、FacadesはEloquentと似ています。どちらのフレームワークもそれをサポートしていますが、Lumenだけがそれを完全に無効にする機能を提供しており、デフォルトでは無効になっています。
しかしここで、ほとんどの場合誤解されているコンセプトがあります。Facadesはデザインパターンの一つです。

Lumenで無効にするのは、実はファサードクラスと、Laravelが開発者がいくつかのモジュール(Log、Authなど)に簡単にアクセスするために便利なグローバルエイリアスです。しかし、app()ヘルパー関数を使用して、パラメータとしてファサードアクセサを渡すことは可能です。
実際、Laravelをファサードなしで使いたい場合は、エイリアス定義をすべて削除し、常にapp()ヘルパー関数を使用すればいいのです。これは、ファサードを無効にするのではなく、ファサードを使わないということであり、結局は同じことなのです。
パフォーマンスの観点からは、ファサードを使うことで本当にパフォーマンスが低下するかどうかを判断するのは難しいです。なぜなら、ベンチマークアプリケーションでは、この構造を多用しないと違いが出ないからです。

違い7:Artisanジェネレータ

Artisanは、LaravelとLumenのコマンドラインツールです。どちらも同じ構造を使用しています。しかし、LaravelはLumenよりはるかに多くのコマンドを利用できます。
その良い例がジェネレーターです。Laravelでは、「make」コマンドがあり、基本的にどんな構造でもコード上に生成することができます。Lumenでは、サンプルファイルからコピー&ペーストで生成する必要があります。全く派手さはありません。
しかし、artisanはリクエストの実行時間に影響を与えません。APIパフォーマンスに差が出るわけではないのですが、Lumenのデメリットとしては考慮が必要です。

その他:コミュニティ・サードパーティ

LaravelとLumenは基本的に同じコミュニティを共有していますが、Laravelの方が人気があることは明らかです。そのため、オンラインヘルプを見つけるのも簡単です(Lumenより簡単)。また、Laravel用にビルドされたコンポーネントの数は、Lumen用にビルドされたものよりもかなり多いです。通常、最も大きなコンポーネント(Passport、Socialite、Debugbarなど)は、LaravelとLumenの両方に同梱されていますが、Lumen版は常にLaravelコンポーネントの適合バージョンです。

参考

https://medium.com/@jeffalmeida_27473/laravel-vs-lumen-what-should-i-use-63c196822b2d

アプリケーションカテゴリの最新記事