第2回 Laravel のアーキテクチャ

この記事について

第2回 Laravel のアーキテクチャ

この記事について

チュートリアルを始める前に、まだ Laravel のアーキテクチャをご存知ない方向けに、ざっくり理解できるよう図解しました。

Laravel の主要なクラス群

いわゆる MVC パターン(厳密には、ウェブアプリケーションの場合は MVC2 と呼ばれ、狭義の MVC とは区別されます。興味のある方はググってみてください)で、M = Model, V = View, C = Controller の仕組みが備わっています。

もう少し細かく見ると、以下のようなクラス群がフレームワークの核になっています。

  • Application
  • Kernel
  • Router
  • Route
  • Middleware
  • Request
  • FormRequest
  • Controller
  • ServiceProvider
  • Event
  • Job
  • Model
  • View
  • Response

フレームワークの構成と処理フロー

これらの要素が、どのように処理を繋いでいくのか、図にしました。

図1. フレームワークの処理フロー

クライアントからHTTPプロトコルに乗ってリクエストが送られ、アプリケーションで処理した後、レスポンスを返します。

この流れはどのフレームワークでも共通です。

最初に、Request と Response のところを中心に、データの受け渡しのフローを見てみましょう。

  1. public/index.php が HTTP サーバーから呼び出され、リクエストが渡されます
  2. index.php では、まず Application オブジェクトを生成します
  3. Application はフレームワークで利用する ServiceProvider を登録します
  4. 続いて Kernel オブジェクトが生成されます
  5. index.php では、リクエストを capture し、Request オブジェクトを生成します
  6. index.php から Kernel::handle メソッドを呼び出します
  7. Kernel オブジェクトは Router オブジェクトに処理を委譲します
  8. Router オブジェクトは、URL から適切な Route オブジェクトを生成します
  9. Route オブジェクトは、Controller クラスを探し、適切なアクションメソッドを呼び出します。
  10. 必要であれば Response オブジェクトを生成します
  11. HTTPサーバーにレスポンスを返します

だいたい、こんな流れになっています。

ルーティングファイル(routes/web.php, routes/api.php)でルートとして登録された、Controller クラスのメソッドはアクションメソッドと呼ばれ、リクエストの入り口になります。

web.php に以下のようなルートが設定されているとしたら、HomeController クラスの index メソッドが、アクションメソッドです。

Route::get('/', 'WelcomeController@index')->name('welcome');

Controller → View

Controller から View を返すまでが、アプリケーション固有の処理になるのですが、アクションメソッドの引数に Request を指定すると、Laravel は Request のインスタンスを自動で割り当ててくれます。

前回のおさらいも兼ねて、以下のサンプルコードを見てください。

<?php
declare(strict_types=1);

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class WelcomeController extends Controller
{
    public function index(Request $request)
    {
        return view('welcome')->with(['message' => $request->query('message')]);
    }
}

message というパラメーターが、クエリーストリング経由で渡ってくることを期待しています。

それを message というキーとマップさせて、View オブジェクトに渡しています( view() 関数が、View オブジェクトを生成してくれます)。

テンプレート(welcome.blade.php)には以下のように {{ $message }} と埋め込みます。

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Laravel</title>
  </head>
  <body>
    {{ $message }}
  </body>
</html>

http://localhost:8000/?message=Hello%20World%21

へアクセスすると、画面に Hello World! と表示されると思います。

まとめ

フレームワークの内部でどのような処理が行われているか、普段はあまり意識する必要はありませんが、概要は理解しておいた方がいいでしょう。

また、Request を受け取って、View を返すまでの処理を復習してみました。上の例以外でも、下記のページなどを参考にして、様々なリクエストを受け取って、画面に表示させてみてください。

HTTP Requests - Laravel - The PHP Framework For Web Artisans

Posted in Architecture on 7月 23, 2017