NaifyViewテンプレートの実装例

Naifyはテンプレートエンジンを強制しません。ここではNaifyViewを使う場合に、Controller側で値を渡し、BaseController側で描画する流れを示します。

アプリ側の実装例。 NaifyViewはNaify本体の必須要素ではありません。テンプレートエンジンの採用はアプリ側で決められます。

NaifyViewの初期化とgetView()

Hello Worldの配置に libs/NaifyView と views を追加します。ブートストラップでAppを実行する前にNaifyViewを起動します。

// SampleAppBootstrap.php($app->run() より前)
require __DIR__ . '/libs/NaifyView/NaifyView.php';
\NaifyView\NaifyView::boot();

BaseControllerのクラス内に次のプロパティとメソッドを追加します。getView() はこのアプリで定義するヘルパーで、Controllerから共通のViewを取得します。

private ?\NaifyView\View\View $view = null;

protected function getView(): \NaifyView\View\View
{
    if ($this->view === null) {
        $root = $this->context->getConfig()->getSystemDir();
        $config = \NaifyView\NaifyView::configure($root . '/views');
        $this->view = \NaifyView\NaifyView::create($config);
    }
    return $this->view;
}

BaseControllerの onActionAfter() は後述の描画処理へ置き換えます。このページのControllerは app/Controllers/ViewExampleController.php、テンプレートは views/hello.html に保存します。

routes/routes.php のコールバック内で、既存の $to を使って次のルートを追加します。

$router->get('/view-hello/{name}', $to('ViewExampleController::hello'));

Controllerでの使い方

Controllerでは必要な値を集め、テンプレート名と変数を決めます。

namespace App\Controllers;

class ViewExampleController extends BaseController
{
    public function helloAction(): void
    {
        $name = $this->context->getUrlParam('name', 'World');

        $view = $this->getView();
        $view->assign('name', $name);
        $view->setTemplate('hello.html');
    }
}

BaseControllerの後処理で描画

描画を共通化するなら、各actionでechoせず、後処理でまとめてrenderします。

// BaseController::onActionAfter() でテンプレートを描画・出力する
protected function onActionAfter(): void
{
    $view = $this->getView();
    if ($view->getTemplate()) {
        echo $view->render();
    }
}

テンプレートファイル

<!doctype html>
<html>
<body>
  <h1>Hello, {{ name }}!</h1>
</body>
</html>