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>