HTML ビューとテンプレート

概要

Flight はデフォルトで基本的な HTML テンプレート機能を備えています。テンプレートは、アプリケーションのロジックをプレゼンテーション層から分離する非常に効果的な方法です。

理解

アプリケーションを構築する際、エンドユーザーに返す HTML を準備する必要があるでしょう。PHP 自体がテンプレート言語ですが、データベース呼び出し、API 呼び出しなどのビジネスロジックを HTML ファイルに混ぜ込んでしまうと、テストや分離が非常に困難になります。データをテンプレートに押し込み、テンプレート自身にレンダリングさせることで、コードの分離と単体テストがはるかに容易になります。テンプレートを使用すれば、私たちに感謝するはずです!

基本的な使用方法

Flight では、デフォルトのビューエンジンを置き換えるために、独自のビュー クラスを登録するだけで簡単に切り替えられます。Smarty、Latte、Blade などの使用例を見るには、下にスクロールしてください!

Latte

推奨

Latte テンプレート エンジンをビューで使用する方法を以下に示します。

インストール

composer require latte/latte

基本的な設定

主なアイデアは、render メソッドをオーバーライドして、デフォルトの PHP レンダラーではなく Latte を使用することです。

// overwrite the render method to use latte instead of the default PHP renderer
Flight::map('render', function(string $template, array $data, ?string $block): void {
    $latte = new Latte\Engine;

    // Where latte specifically stores its cache
    $latte->setTempDirectory(__DIR__ . '/../cache/');

    $finalPath = Flight::get('flight.views.path') . $template;

    $latte->render($finalPath, $data, $block);
});

Flight での Latte の使用

Latte でレンダリングできるようになったら、以下のようにできます:

<!-- app/views/home.latte -->
<html>
  <head>
    <title>{$title ? $title . ' - '}My App</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <h1>Hello, {$name}!</h1>
  </body>
</html>
// routes.php
Flight::route('/@name', function ($name) {
    Flight::render('home.latte', [
        'title' => 'Home Page',
        'name' => $name
    ]);
});

ブラウザで /Bob にアクセスすると、出力は次のようになります:

<html>
  <head>
    <title>Home Page - My App</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <h1>Hello, Bob!</h1>
  </body>
</html>

さらなる読み物

Latte をレイアウトで使用するより複雑な例は、このドキュメントの awesome plugins セクションに示されています。

Latte の完全な機能(翻訳や言語機能を含む)については、公式ドキュメント を読んでください。

ビルトインのビュー エンジン

非推奨

注意: これは依然としてデフォルトの機能であり、技術的には動作します。

ビュー テンプレートを表示するには、render メソッドをテンプレート ファイルの名前とオプションのテンプレート データで呼び出します:

Flight::render('hello.php', ['name' => 'Bob']);

渡したテンプレート データは自動的にテンプレートに注入され、ローカル変数のように参照できます。テンプレート ファイルは単なる PHP ファイルです。hello.php テンプレート ファイルの内容が以下のようである場合:

Hello, <?= $name ?>!

出力は次のようになります:

Hello, Bob!

set メソッドを使用して、手動でビュー変数を設定することもできます:

Flight::view()->set('name', 'Bob');

変数 name はすべてのビューで利用可能になります。したがって、以下のように単純に実行できます:

Flight::render('hello');

render メソッドでテンプレート名を指定する際は、.php 拡張子を省略できます。

デフォルトでは、Flight はテンプレート ファイルのために views ディレクトリを探します。テンプレートの代替パスを設定するには、以下の設定を実行します:

Flight::set('flight.views.path', '/path/to/views');

レイアウト

ウェブサイトでは、交換可能なコンテンツを持つ単一のレイアウト テンプレート ファイルが一般的です。レイアウトで使用するコンテンツをレンダリングするには、render メソッドにオプションのパラメータを渡せます。

Flight::render('header', ['heading' => 'Hello'], 'headerContent');
Flight::render('body', ['body' => 'World'], 'bodyContent');

ビューには、headerContentbodyContent という名前の変数が保存されます。次に、レイアウトを以下のようにレンダリングできます:

Flight::render('layout', ['title' => 'Home Page']);

テンプレート ファイルが以下のようである場合:

header.php

<h1><?= $heading ?></h1>

body.php

<div><?= $body ?></div>

layout.php

<html>
  <head>
    <title><?= $title ?></title>
  </head>
  <body>
    <?= $headerContent ?>
    <?= $bodyContent ?>
  </body>
</html>

出力は次のようになります:

<html>
  <head>
    <title>Home Page</title>
  </head>
  <body>
    <h1>Hello</h1>
    <div>World</div>
  </body>
</html>

Smarty

Smarty テンプレート エンジンをビューで使用する方法を以下に示します:

// Load Smarty library
require './Smarty/libs/Smarty.class.php';

// Register Smarty as the view class
// Also pass a callback function to configure Smarty on load
Flight::register('view', Smarty::class, [], function (Smarty $smarty) {
  $smarty->setTemplateDir('./templates/');
  $smarty->setCompileDir('./templates_c/');
  $smarty->setConfigDir('./config/');
  $smarty->setCacheDir('./cache/');
});

// Assign template data
Flight::view()->assign('name', 'Bob');

// Display the template
Flight::view()->display('hello.tpl');

完全性を期すために、Flight のデフォルトの render メソッドもオーバーライドしてください:

Flight::map('render', function(string $template, array $data): void {
  Flight::view()->assign($data);
  Flight::view()->display($template);
});

Blade

Blade テンプレート エンジンをビューで使用する方法を以下に示します:

まず、Composer 経由で BladeOne ライブラリをインストールする必要があります:

composer require eftec/bladeone

次に、Flight で BladeOne をビュー クラスとして設定できます:

<?php
// Load BladeOne library
use eftec\bladeone\BladeOne;

// Register BladeOne as the view class
// Also pass a callback function to configure BladeOne on load
Flight::register('view', BladeOne::class, [], function (BladeOne $blade) {
  $views = __DIR__ . '/../views';
  $cache = __DIR__ . '/../cache';

  $blade->setPath($views);
  $blade->setCompiledPath($cache);
});

// Assign template data
Flight::view()->share('name', 'Bob');

// Display the template
echo Flight::view()->run('hello', []);

完全性を期すために、Flight のデフォルトの render メソッドもオーバーライドしてください:

<?php
Flight::map('render', function(string $template, array $data): void {
  echo Flight::view()->run($template, $data);
});

この例では、hello.blade.php テンプレート ファイルは以下のように見えるかもしれません:

<?php
Hello, {{ $name }}!

出力は次のようになります:

Hello, Bob!

関連項目

  • 拡張 - 異なるテンプレート エンジンを使用するために render メソッドをオーバーライドする方法。
  • ルーティング - ルートをコントローラーにマッピングし、ビューをレンダリングする方法。
  • レスポンス - HTTP レスポンスをカスタマイズする方法。
  • フレームワークとは? - テンプレートが全体像にどのように適合するか。

トラブルシューティング

  • ミドルウェアにリダイレクトがあるのに、アプリがリダイレクトされない場合は、ミドルウェアに exit; 文を追加してください。

変更履歴

  • v2.0 - 初期リリース。