PHP で Web サーバを開発するのであれば、Laravel というフレームワークを使うのが良いと思う。 実際、Jetbrains の 2020 年のレポート によると、半数が Laravel を使っているとのこと。

何が良いのかを挙げてみたいと思う。

その前に、composer をインストールして Installation に書かれているように、example-app を作ってみると概要をつかめると思う。


PHP コードと HTML が分離されている点

example-app 下には Directory Structure にあるように各種ディレクトリが用意される。

他のフレームワークでもよく見られる、Model-View-Controller パターンであろうか。

主要なディレクトリは次のようなものである。

  • routes の下には、URL とコントローラの対応づけが置かれている。
  • app 下は、アプリケーション用のコードであり、app/Http/Controllers にコントローラのベースクラスが生成されている。
  • resources/views 下に、画面表示用のテンプレートが置かれる。ファイル名は、*.blade.php になっている。
  • public ディレクトリは、公開するディレクトリ
  • storage ディレクトリには、ログ、セッション情報、一時ファイルなどが置かれる

example-app の場合は、routes/web.php で、blade テンプレート welcome.blade.php が表示されるようになっているが、 通常は、Controllers にあるような記述になるだろう。

アプリケーションコードと、テンプレートが別々のファイルになっており、 PHP のコードと HTML が混在していてわかりづらく、分業もしづらい、といった状況が 解消されているように思える。

強力なテンプレート

テンプレートは、Blade Templates の章を眺めれば難しくはないと思うが、次のような機能がある。

  • コントローラから渡された変数の表示
  • ループ
  • 条件分岐
  • クロスサイトスクリプティング対策に必要なエスケープ処理(必要に応じて OFF できる)
  • json データの受け渡し
  • PHP コードの実行

CSRF 対策は必須だと思うが、form 内に @csrf と書いておけば、csrf token を埋めこんでくれるのも嬉しいところだ。

DB アクセスが簡単

DB へは、次の3種類の問い合わせが可能。

  • SQL 文
  • Query Builder
  • ORM(object-relational mapper)

SQL のほうがわかりやすく移植性も高いため、ORM は使わない、という場合も多々あるため、これら3種類のアクセス方法が用意されているのは嬉しい。

特に私が便利だと感じたのは、Query Builder だ。既存のリレーショナル DB に対して、問い合わせの記述を読みやすくできる。

$user = DB::table('users')->where('name', 'John')->first();

のように書けるので、非常にわかりやすい。

リクエスト、レスポンスの扱いが簡単

リクエストから input パラメータを読み出すのは、典型的には、 Accessing The Request にあるような形式で、 非常に簡単である。

Dependency Injection & Route Parameters にあるように、URL 内のパターンをパラメータにするこも可能である。

レスポンスは、view を返す、JSONを返す、ファイルを返す、リダイレクトする、などがサポートされているが、 HTTP Responsesを見れば難しくはないと思う。 リダイレクトさせるために Location ヘッダをセットしたりする必要はない。

リクエスト値をバリデーション(検証)して応答を返すことになると思うが、 Laravel に内蔵されているバリデーションの仕組みでは、 エラー発生時にはエラー内容や入力値をセッションにセットして、 前画面にリダイレクトさせる、という動きが基本のようだ。 もちろん、自分でエラーチェックして、view を返すという動きにすることもできるだろう。

コマンドラインインタフェース

Artisan Console と呼ばれる コマンドラインインタフェースが用意されている。

コマンドの拡張

このコマンドラインインタフェースはWriting Commandsにあるように コマンドの拡張が可能となっている。

Web サーバとは別に cron で、定期的に処理を実行したい場合に便利だ。

config ディレクトリ下の設定内容が反映され、Web サーバと同じ設定値を使用することができる。

tinker (対話的実行)

コマンドを対話的に実行することができて便利である。

例えば、tiner を起動して

>>> DB::table('users')->get()

のようにして、DB テーブルを読み出すなどといったことが可能である。

充実したドキュメント

Documentation で framework の構成はつかむことができる。 API の詳しい部分については、API Documentation で確認することができる。

最悪、API Document には、ソースコードへのリンクがあるので、ソースコードのコメント なども参考になることがあるだろう。

安定したリリース

Support Policy にあるように、LTS (Long Term Support) が用意されている。


私はまだ十分使いこなせていないが、以上の他にも様々な機能が用意されている。 ドキュメントを探検してみてはどうかと思う。