haikara/typewriter

此包最新版本(0.3.0)没有提供许可信息。

0.3.0 2024-08-15 08:36 UTC

This package is auto-updated.

Last update: 2024-09-15 08:55:34 UTC


README

利用输出缓冲的模板引擎。

  • 可以设置View变量。
  • 可以包含其他模板文件。

使用方法

设置和注册View变量。

// 引数にディレクトリを指定してインスタンス化する
$view = new Haikara\Typewriter\Typewriter('./', BASE_ROUTE, DOCUMENT_ROOT);

// View-Assign変数の登録。
$view->assign('message', 'こんにちは世界!');
$view->assign('username', 'User1');

// 配列も同様に登録する。
$view->assign('clientside_langs', [
    'HTML', 'CSS', 'JavaScript'
]);

// テンプレートファイルを指定。echoで出力する。
echo $view->render('./view.php');

在模板内部调用已注册的View变量。

<!-- View-Assign変数の出力。以下2つの記述は等価。 -->
<p><? echo $message ?></p>
<p><?= $message ?></p>

<!-- エスケープして出力。-->
<p><?= self::esc($message) ?></p>

<!-- foreachで配列を回して出力。 -->
<ul>
    <?php foreach ($clientside_langs as $lang) : ?>
        <li><?= self::esc($lang) ?></li>
    <?php endforeach ?>
</ul>

<!-- 別ファイルの読み込み -->
<?php $this->include('./component.php', [
    'message2' => 'includeの引数です。',
    'username' => $username
]) ?>

<!-- ブラウザキャッシュ対策 -->
<!-- パラメータとしてファイルの更新日時を付加したパスを取得する。 -->
<link rel="stylesheet" href="<?= $this->disCache('style.css') ?>">

Filter功能

对值进行多次处理的链式方法简写。

<!-- 第一引数にとった値に対し、第二引数以降にとったCallableを適用する。 -->
<!-- 以下の記述はすべて等価である。 -->
<?= self::filter(
    '<script>alert("XSS!!")</script>',
    'strtoupper',
    [self, 'esc']
) ?>

<?= self::filter(
    '<script>alert("XSS!!")</script>',
    strtoupper(...),
    self::esc(...)
) ?>

<?= self::filter('<script>alert("XSS!!")</script>', ...[
    strtoupper(...), self::esc(...)
]) ?>

用户定义的辅助函数

通过将可调用的值注册为View变量,可以作为辅助函数处理。

// DateTimeを受け取り、現在の年齢をint型で返す
$view->assign('getAge', function (\DateTimeInterface $birthday): int {
    $diff = (new DateTime())->diff($birthday);
    return $diff->y;
});

// DateTimeImmutable(誕生日)をView-Assign変数として登録
$view->assign('birthday', new \DateTimeImmutable('1994-03-21'));

// 消費税を加える。
$view->assign('taxInclude', fn (int $price): int => (int)floor($price * 1.1));

// 金額をカンマ区切りでフォーマットし、頭に¥マークを付けて返す。
$view->assign('jpyPriceFormat', fn (int $price): string => '¥' . number_format($price));
<p><?= $getAge($birthday) . '歳' ?></p>

<!-- 複数のヘルパー関数を、Filter機能で順次適用する。 -->
<p><?= self::filter(1000, ...[
    $taxInclude(...), $jpyPriceFormat(...)
]) ?></p>