コンテンツにスキップ

Twig

出典: フリー教科書『ウィキブックス(Wikibooks)』

概要

[編集]

Twigは、PHPのための柔軟で安全、かつ高速なテンプレートエンジンです。Symfonyプロジェクトの一部として開発され、シンプルで表現力豊かな構文を特徴としています。

インストールと設定

[編集]

Composerでのインストール

[編集]
composer require "twig/twig:^3.0"

基本セットアップ

[編集]
<?php
require_once '/path/to/vendor/autoload.php';

$loader = new \Twig\Loader\FilesystemLoader('/path/to/templates');
$twig = new \Twig\Environment($loader, [
    'cache' => '/path/to/compilation_cache',
    'debug' => true,
    'auto_reload' => true
]);

基本構文

[編集]

変数の出力

[編集]
{# 基本的な変数の出力 #}
{{ name }}
{{ user.name }}
{{ user['name'] }}

{# HTMLエスケープ #}
{{ data|escape }}
{{ data|e }}

制御構文

[編集]

条件分岐

[編集]
{% if user.isLoggedIn %}
    <h1>ようこそ、{{ user.name }}さん</h1>
{% else %}
    <h1>ログインしてください</h1>
{% endif %}

ループ

[編集]
{% for item in items %}
    <div class="item">
        <h2>{{ item.title }}</h2>
        <p>{{ item.description }}</p>
    </div>
{% else %}
    <p>アイテムが見つかりません</p>
{% endfor %}

テンプレート継承

[編集]

親テンプレート

[編集]
base.html.twig
<!DOCTYPE html>
<html>
    <head>
        <title>{% block title %}{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
    </head>
    <body>
        {% block body %}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>

子テンプレート

[編集]
page.html.twig
{% extends 'base.html.twig' %}

{% block title %}ページタイトル{% endblock %}

{% block body %}
    <h1>コンテンツ</h1>
{% endblock %}

フィルタ

[編集]

組み込みフィルタ

[編集]
  • date
  • escape/e
  • upper
  • lower
  • trim
  • nl2br
  • raw
  • length

カスタムフィルタ

[編集]
$filter = new \Twig\TwigFilter('price', function ($number) {
    return number_format($number, 2) . '円';
});
$twig->addFilter($filter);

関数

[編集]

組み込み関数

[編集]
  • range
  • date
  • dump
  • include
  • max
  • min
  • random

カスタム関数

[編集]
$function = new \Twig\TwigFunction('calculateTax', function ($amount) {
    return $amount * 1.1;
});
$twig->addFunction($function);

マクロ

[編集]

マクロの定義と使用

[編集]
{% macro input(name, value, type = "text", size = 20) %}
    <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}">
{% endmacro %}

{% import "forms.html" as forms %}
{{ forms.input('username') }}

インクルードとエンベッド

[編集]

インクルード

[編集]
{% include 'header.html' %}
{% include 'sidebar.html' with {'items': menu_items} %}

エンベッド

[編集]
{% embed "base_sidebar.html" %}
    {% block sidebar %}
        <h3>カスタムサイドバー</h3>
    {% endblock %}
{% endembed %}

エクステンション

[編集]

コアエクステンション

[編集]
  • StringLoader
  • Debug
  • Sandbox
  • Optimizer
  • Profiler

カスタムエクステンション

[編集]
class CustomExtension extends \Twig\Extension\AbstractExtension
{
    public function getFilters()
    {
        return [
            new \Twig\TwigFilter('custom', [$this, 'customFilter']),
        ];
    }

    public function customFilter($value)
    {
        // フィルタの処理
    }
}

セキュリティ

[編集]

サンドボックス機能

[編集]
  • タグの制限
  • フィルタの制限
  • 関数の制限

エスケープ戦略

[編集]
  • HTML自動エスケープ
  • JavaScriptエスケープ
  • CSSエスケープ

パフォーマンス最適化

[編集]

キャッシュ設定

[編集]
  • コンパイルキャッシュ
  • オートリロード
  • 最適化オプション

ベストプラクティス

[編集]
  • テンプレートの分割
  • キャッシュの活用
  • 適切なエスケープ処理

デバッグ

[編集]

デバッグツール

[編集]
  • dump()関数
  • プロファイラ
  • エラーハンドリング

開発環境設定

[編集]
  • デバッグモード
  • 厳密な変数チェック
  • 自動リロード

統合

[編集]

フレームワーク統合

[編集]
  • Symfony
  • Laravel
  • Slim
  • CodeIgniter

その他のツール

[編集]
  • PHPUnit
  • Composer
  • IDE支援

APIリファレンス

[編集]

主要なクラス

[編集]
  • Environment
  • LoaderInterface
  • Template
  • Extension

コミュニティリソース

[編集]

ドキュメント

[編集]
  • 公式ドキュメント
  • チュートリアル
  • クックブック

サポート

[編集]
  • Stack Overflow
  • GitHub Issues
  • コミュニティフォーラム