テンプレートを作成して使用する


<img src="{{Absolute_url(asset('images/logo.png')) }}" alt="Symfony!" />
念のため言っておきますが、 Controller (コントローラー) は、symfony プログラムに入るすべてのリクエストを処理する責任があります。実際、コントローラーはコードをテストして再利用できるように、面倒な作業のほとんどを他の場所に委任します。コントローラーが HTML、CSS、またはその他のコンテンツを生成する必要がある場合、その作業をテンプレート エンジンに渡します。この章では、ユーザーにコンテンツを返したり、メールにデータを入力したりするための強力なテンプレートを作成する方法を学びます。また、ショートカット、テンプレートを拡張するための賢い方法、テンプレート コードを再利用する方法についても学びます。

テンプレートのレンダリング方法については、「Framework Start」のコントローラーを参照してください。

テンプレート

テンプレートは、テキスト形式 (html、xml、csv、LaTex...) に基づいて任意のテキスト ファイルを生成します。私たちが最もよく知っているテンプレートのタイプは、php テンプレートです。これは、PHP エンジンによって解析されるテキストと PHP コードを含むテキスト ファイルです。 symfony フレームワークのより強力なテンプレート言語。それは Twig と呼ばれます。 Twig を使用すると、簡潔で読みやすく、デザイナーにとって使いやすいテンプレートを作成できます。これは、いくつかの点で PHP テンプレートよりもはるかに強力です。

<!DOCTYPE html>
<html>
    <head>
        <title>Welcome to Symfony!</title>
    </head>
    <body>
        <h1><?php echo $page_title ?></h1>
 
        <ul id="navigation">            <?php foreach ($navigation as $item); ?>
                <li>
                    <a href="<?php echo $item->getHref(); ?>">                        <?php echo $item->getCaption(); ?>
                    </a>
                </li>            <?php endforeach; ?>
        </ul>
    </body>
</html>

Twig は 3 つの特別な構文を定義します:


    {{ ... }}
  • 「何か言ってください」 ": 変数の値または式の結果をテンプレートに出力します。
  • {% ... %}
  • 「何をすべきか」: *タグ (タグ)* テンプレート ロジックを制御し、for などのステートメントを実行するために使用されます。ループステートメントなど
  • {# ... #}
  • 「コメント」: PHP の
  • /* comment */
  • 構文に相当します。単一行および複数行のコメントに使用されます。コメントの内容はページとして出力されません。
  • twig には、テンプレートがレンダリングされる前に出力コンテンツを変更できる
filters

も含まれています。次の例では、レンダリング前に title 変数をすべて大文字にします。

<!DOCTYPE html>
<html>
    <head>
        <title>Welcome to Symfony!</title>
    </head>
    <body>
        <h1>{{ page_title }}</h1>
 
        <ul id="navigation">            {% for item in navigation %}
                <li><a href="{{ item.href }}">{{ item.caption }}</a></li>            {% endfor %}
        </ul>
    </body>
</html>
Twig には、デフォルトで使用できる多数の組み込みタグと変数フィルターがあります。 Twig 拡張機能を利用して、独自の

custom

レギュレータや関数 (その他) を追加することもできます。

Twig 拡張機能の登録は非常に簡単です。新しいサービスを作成し、
Twig.extension

でタグ付けするだけです。

Twig コードは PHP コードに非常に似ていますが、両者の間には微妙な違いがあります。次の例では、標準の for タグと cycle 関数を使用して 10 個の div タグを出力し、oddeven の CSS クラスを交互に使用します。 。

   {{ title|upper }}

この章のテンプレート ルーチンは、twig と php の両方を使用して表示されます。

Twig を使用しない場合、または無効にしている場合は、kernel.execption イベントを使用して独自の例外処理を実装する必要があります。

小枝を使用する理由

twig テンプレートはわかりやすくするためのものであり、php タグは扱いません。これはデザインの場合に当てはまります。小枝テンプレートは、ロジックを考慮せず、プレゼンテーションのみを担当します。 Twig を使えば使うほど、Twig の良さがより理解され、その機能の恩恵を受けることができます。もちろん、世界中のWebデザイナーからも気に入られるでしょう。

スペース制御、サンドボックス化、自動 HTML エスケープ、手動コンテキスト出力エスケープ、「テンプレートにのみ影響する」カスタム関数やレギュレーターなど、Twig にはできて PHP にはできないことがたくさんあります。 twig には、テンプレートの作成をより便利かつ迅速にするための小さな関数がいくつか含まれています。論理ループと if ステートメントを組み合わせた次の例を考えてみましょう:

{% for i in 0..10 %}
    <div class="{{ cycle(['odd', 'even'], i) }}">
      <!-- some HTML here -->
    </div>{% endfor %}

Twig テンプレートのキャッシュ

Twig は高速で、各 Twig テンプレートはネイティブ PHP クラスにコンパイルされ、キャッシュされます。コンパイルされたクラスは、var/cache/{environment}/twig ディレクトリに保存されます ({environment} は、dev などの環境です) prod)、場合によっては同時にデバッグできるため、非常に便利です。環境の詳細については、次を参照してください: Environment

debug モードが利用可能な場合 (devEnvironment)、twig テンプレートが変更された場合、自動的に再コンパイルされます。つまり、キャッシュのクリアを気にせずにテンプレートを変更できるということです。

debug モードがオフになっている場合 (prod 環境)、Twig テンプレートを再生成するには、Twig キャッシュ ディレクトリを手動でクリアする必要があります。プログラムをデプロイするときにこれを忘れずに行ってください。

テンプレートの継承とレイアウト

ほとんどの場合、テンプレートにはヘッダー、フッター、サイドバーなどのプロジェクト内の共通要素が含まれます。 Symfony では、この問題に別の観点からアプローチします。テンプレートは他のテンプレートで装飾できます。これは PHP クラスと同様に機能します。テンプレートの継承により、サイトのすべての共通要素を含む基本「レイアウト」テンプレートを作成でき、blocks (「基本メソッドを含む」PHP 基本クラスのように) として定義されます。 ")。子テンプレートは、レイアウトの基本テンプレートを継承し、そのブロックのいずれかをオーバーライドできます (「PHP サブクラスが親クラスの特定のメソッドをオーバーライドする」のと同様)。

最初にレイアウト基本ファイルを作成します:

<ul>   
 {% for user in users if user.active %}
        <li>{{ user.username }}</li>    {% else %}
        <li>No users found</li>    {% endfor %}</ul>
Twig:{# app/Resources/views/base.html.twig #}<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Test Application{% endblock %}</title>
    </head>
    <body>
        <div id="sidebar">            {% block sidebar %}
                <ul>
                    <li><a href="/">Home</a></li>
                    <li><a href="/blog">Blog</a></li>
                </ul>            {% endblock %}
        </div>
 
        <div id="content">            {% block body %}{% endblock %}
        </div>
    </body>
</html>

Twig テンプレートの継承についての説明ですが、twig テンプレートと php テンプレートの考え方は同じです。

このテンプレートは、単純な 2 列の HTML ページを定義します。この例では、3 つの {% block %} 領域 (つまり、titlesidebarbody) が定義されています。各ブロックは、それを継承するサブテンプレートによってオーバーライドすることも、現在のデフォルト実装を保持することもできます。テンプレートを直接レンダリング (出力) することもできます。ただし、この時点では基本テンプレートで定義された内容のみが表示され、titlesidebarbody はデフォルト値のままとなります。

子テンプレートは次のようになります:

PHP:<!-- app/Resources/views/base.html.php -->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title><?php $view['slots']->output('title', 'Test Application') ?></title>
    </head>
    <body>
        <div id="sidebar">            <?php if ($view['slots']->has('sidebar')): ?>
                <?php $view['slots']->output('sidebar') ?>
            <?php else: ?>
                <ul>
                    <li><a href="/">Home</a></li>
                    <li><a href="/blog">Blog</a></li>
                </ul>            <?php endif ?>
        </div>
 
        <div id="content">            <?php $view['slots']->output('body') ?>
        </div>
    </body>
</html>
Twig:{# app/Resources/views/blog/index.html.twig #}{% extends 'base.html.twig' %} {% block title %}My cool blog posts{% endblock %} {% block body %}
    {% for entry in blog_entries %}
        <h2>{{ entry.title }}</h2>
       <p>{{ entry.body }}</p>    {% endfor %}{% endblock %}

親テンプレートは特別な文字列 syntaxbase.html.twig で表され、このパスはは、プロジェクト全体の app/Resources/views ディレクトリに対する相対パスです。同じ論理名で ::base.html.twig を使用することもできます。以下の テンプレート名と場所を参照してください。

テンプレート継承のキーワードは、{% extends %} タグです。このタグは、レイアウトを設定し、いくつかのブロックを定義する親テンプレートを最初に評価するようにテンプレート エンジンに指示します。次に、子テンプレートがレンダリングされ、上記の例の親テンプレートで定義されている 2 つのブロック titlebody は、子テンプレートの同じ名前のブロック コンテンツに置き換えられます。 。 blog_entries の値に応じて、出力コンテンツは次のようになります。

php:<!-- app/Resources/views/blog/index.html.php --><?php $view->extend('base.html.php') ?> <?php $view['slots']->set('title', 'My cool blog posts') ?> <?php $view['slots']->start('body') ?>
    <?php foreach ($blog_entries as $entry): ?>
        <h2><?php echo $entry->getTitle() ?></h2>
        <p><?php echo $entry->getBody() ?></p>    <?php endforeach ?><?php $view['slots']->stop() ?>

sidebar ブロックは子テンプレートで定義されていないため、コンテンツは次のようになります。親テンプレートのものが表示されます。親テンプレートの {% block %} タグ内のコンテンツは、常にデフォルト値として使用されます。

テンプレートの継承は、任意のレベルで実行できます。 Symfony プロジェクトは通常、「3 レベルの継承」モデルを使用してテンプレートとページを整理します。継承を使用して Twig テンプレートを整理する方法を参照してください。

テンプレート継承を使用する場合は、次の点に注意してください:

  • テンプレートで {% extends %} を使用する場合、それはテンプレートの最初のタグである必要があります。

  • ベース (レイアウト) テンプレート内の {% block %} タグが多ければ多いほど良いです。子テンプレートですべてのブロックを定義する必要はないことに注意してください。親テンプレート 。基本テンプレートで定義されるブロックが増えるほど、レイアウトの柔軟性が高まります。

  • 複数のテンプレートで重複したコンテンツが見つかった場合は、親テンプレート # でそのコンテンツに対して {% ブロック %}## を定義する必要がある可能性があります。場合によっては、コンテンツを新しいテンプレートに配置し、そのテンプレート内に include する方が良い解決策となる場合があります。 (以下を参照: 他のテンプレートを含む)

  • 親テンプレートからブロックのコンテンツを取得する必要がある場合は、

    {{parent() }}# ## 関数 。これは、親ブロックを完全に上書きするのではなく、親ブロックの上に新しいコンテンツを追加するだけの場合に便利です:

    <!DOCTYPE html><html>
        <head>
            <meta charset="UTF-8">
            <title>My cool blog posts</title>
        </head>
        <body>
            <div id="sidebar">
                <ul>
                    <li><a href="/">Home</a></li>
                    <li><a href="/blog">Blog</a></li>
                </ul>
            </div>         <div id="content">
                <h2>My first post</h2>
                <p>The body of the first post.</p>             <h2>Another post</h2>
                <p>The body of the second post.</p>
            </div>
        </body></html>
  • テンプレートの名前と保存場所 ¶

Default この場合、テンプレートは 2 つの異なる場所に保存できます:

{% block sidebar %}
    <h3>Table of Contents</h3>
     {# ... #}     {{ parent() }}{% endblock %}

プログラム レベルのビュー ディレクトリには、プログラム全体の基本テンプレート (プログラム レイアウトとバンドル テンプレート) だけでなく、「サードパーティ バンドルをオーバーライドするために使用されます」「テンプレート」テンプレート (サードパーティ バンドルのテンプレートをオーバーライドする方法)。

app/Resources/views

各サードパーティ バンドルのテンプレートは、独自の

Resources/views/

ディレクトリ (またはサブディレクトリ) に保存されます。バンドルを共有する場合は、app/ ディレクトリではなく、バンドルに配置する必要があります。 多くの場合、使用するテンプレートは

app/Resources/views/

ディレクトリにあります。必要なテンプレート パスは、このディレクトリからの相対パスです。たとえば、app/Resources/views/base.html.twig をレンダリング/継承するには、base.html.twig のパスを使用する必要がありますが、 をレンダリングするにはapp/Resources/views/blog/index.html.twig の場合は、blog/index.html.twig パスを使用する必要があります。 バンドルへのテンプレートの導入

Symfony は、テンプレートを表すために

bundle:directory:filename

文字列構文を使用します。これは、さまざまな種類のテンプレートを表すことができ、それぞれが特定のパスに保存されます。

    AcmeBlogBu​​ndle:Blog:index.html.twig
  • は、特定のページ テンプレートを指定するために使用されます。文字列は 3 つの部分に分かれており、各部分はコロン (:) で区切られており、次の意味を持ちます:
  1. AcmeBlogBu​​ndle

    : (bundle) テンプレートは、src/Acme/BlogBu​​ndle などの AcmeBlogBu​​ndle にあります;

  2. Blog

    : (Directory) は、テンプレートが Resources/viewsBlog サブディレクトリにあることを示します;

  3. ##index.html.twig
  4. : (

    ファイル名) ファイルの実際の名前は index.html.twig です。

    AcmeBlogBu​​ndle が
  5. src/Acme/BlogBu​​ndle
にあると仮定すると、最終的なパスは

src/Acme/BlogBu​​ndle/Resources/views/ になります。ブログ/index.html.twig

  • AcmeBlogBu​​ndle::layout.html.twig この構文は、AcmeBlogBu​​ndle の親テンプレートを指します。中間の「ディレクトリ」部分 (blog など) がなければ、テンプレートは AcmeBlogBu​​ndle の Resources/views/layout.html.twig に配置される必要があります。はい、中央の 2 つのコロンは、「controller」サブディレクトリ部分が無視されることを意味します。

記事「サードパーティ バンドルのテンプレートを上書きする方法」では、AcmeBlogBu​​ndle にあるテンプレートが app/Resources/AcmeBlogBu​​ndle/views/ ディレクトリにある方法について説明します。同じ名前のテンプレートによってオーバーライドされるこのメソッドは、バンドル作成者が提供するバンドル テンプレートをオーバーライドする強力な方法を提供します。

テンプレートの命名構文は見覚えがあるかもしれません。これは、「コントローラーの命名パターン」で説明されている規則に似ています。

テンプレート サフィックス ¶

各テンプレートには 2 つの拡張子があり、 形式 (フォーマット) とテンプレート エンジン (エンジン) を指定するために使用されます。

##ファイル名形式エンジンHTMLTwigHTMLPHPCSS小枝

デフォルトでは、Symfony のテンプレートはすべて Twig または PHP エンジンとして作成でき、サフィックス (.twig または .php) によってどのエンジンを使用するかが決まります。サフィックスの最初の部分 (.html,.css) は、最終的に生成される形式を示します。 symfony がテンプレートを解析する方法を決定するエンジンとは異なり、これは非常にシンプルな戦略であり、HTML (index.html.twig)、XML (index.xml.twig#) を使用できます。 ##)、またはレンダリングされたリソースとしてのその他の形式。詳細については、「テンプレート形式」セクションをお読みください。

利用可能な「エンジン」セクションは構成可能であり、新しいエンジンを追加することも可能です。詳細については、「テンプレート サービスの構成と使用方法」を参照してください。

タグとヘルプ ¶

テンプレートの基本、名前の付け方、テンプレート継承の使用方法についてはすでに理解しています。最も難しい部分は終わりました。次に、他のテンプレートの組み込み、ページへのリンク、画像の組み込みなど、一般的なテンプレート タスクに役立つ多数のツールを見ていきます。

いくつかの特別な Twig タグと関数が Symfony フレームワークに組み込まれており、テンプレート設計者の作業を簡素化できます。 PHP では、テンプレート システムは、テンプレート コンテキストで便利な機能を提供するための拡張可能な helper システムを提供します。

({% block %} & {% extends %}) などのいくつかの組み込み Twig タグを見てきました。 PHP ヘルパー $view['slots']。これからさらに詳しく学びます。

他のテンプレートの紹介

同じテンプレートまたはコード スニペットを複数の異なるページに含める必要があることがよくあります。たとえば、「ニュース記事」プログラムでは、記事を表示するためのテンプレート コードがテキスト ページで使用されたり、「人気の記事」を表示するページ、さらには「最新の記事」の一覧ページなどで使用されたりすることがあります。

PHP コードを再利用する必要がある場合、通常はそのコードを PHP クラスまたは関数に組み込みます。これはテンプレートでも行うことができます。再利用可能なコードを独自のテンプレートに配置し、他のテンプレートからそのテンプレートを含めます。まず、次のように再利用可能なテンプレートを作成します。

path/to/bundle/Resources/views
Twig:{# app/Resources/views/article/article_details.html.twig #}<h2>{{ article.title }}</h2>
<h3 class="byline">by {{ article.authorName }}</h3>
 
<p>    {{ article.body }}</p>

このテンプレートを他のテンプレートに導入するのは簡単です:

php:<!-- app/Resources/views/article/article_details.html.php -->
<h2><?php echo $article->getTitle() ?></h2>
<h3 class="byline">by <?php echo $article->getAuthorName() ?></h3>
 
<p>    <?php echo $article->getBody() ?></p>
Twig:{# app/Resources/views/article/list.html.twig #}{% extends 'layout.html.twig' %} {% block body %}
    <h1>Recent Articles<h1>
     {% for article in articles %}
        {{ include('article/article_details.html.twig', { 'article': article }) }}
   {% endfor %}{% endblock %}

このテンプレートが含まれる場合は、{ { include( ) }}### 鬼ごっこ。テンプレートの命名は、同じ一般的な規則に従っていることに注意してください。 article_details.html.twig テンプレートで article 変数を使用します。これをテンプレートに渡します。この場合、list.html.twig テンプレートで使用できるすべての変数は article_details.html.twig でも使用できるため、これを行う必要はまったくありません ( with_context を false に設定しない限り)。

{'article':article}構文は、標準の Twig ハッシュ マップ (つまり、キーと値のペアの配列) を記述するものです。複数の要素を渡す必要がある場合は、{'foo': foo, 'bar': bar} と記述できます。

ページへのリンク

プログラム内で別のページへのリンクを作成することは、テンプレートでは一般的なことです。 path Twig 関数 (または PHP の router ヘルパー) を使用して、テンプレート内の URL をハードコーディングするのではなく、ルーティング設定に基づいて URL を生成します。後で特定のページの URL を変更する場合は、ルーティング構成を変更するだけで済み、テンプレートによって新しい URL が自動的に生成されます。

たとえば、「_welcome」ページにリンクする場合は、まずそのルーティング構成を定義します。

php:<!-- app/Resources/article/list.html.php --><?php $view->extend('layout.html.php') ?> 
    <?php $view['slots']-               >start('body') ?>    <h1>Recent Articles</h1>     <?php foreach ($articles as $article): ?>        <?php echo $view->render(            'Article/article_details.html.php',            array('article' => $article)        ) ?>    <?php endforeach ?><?php $view['slots']->stop()
 ?>
Annotations:// src/AppBundle/Controller/WelcomeController.php // ...use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class WelcomeController extends Controller{
    /**
     * @Route("/", name="_welcome")
     */
    public function indexAction()
    {
        // ...
   }}
YAML:# app/config/routing.yml_welcome:
    path:     /
    defaults: { _controller: AppBundle:Welcome:index }
XAML:<!-- app/config/routing.yml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://symfony.com/schema/routing        http://symfony.com/schema/routing/routing-1.0.xsd">     <route id="_welcome" path="/">
        <default key="_controller">AppBundle:Welcome:index</default>
    </route></routes>

ページにリンクするには、Twig の path を使用するだけです。これを指定する関数はそれをルーティングするだけです。

PHP:// app/config/routing.phpuse Symfony\Component\Routing\Route;use Symfony\Component\Routing\RouteCollection; $collection = new RouteCollection();$collection->add('_welcome', new Route('/', array(
    '_controller' => 'AppBundle:Welcome:index',))); return $collection;
Twig:<a href="{{ path('_welcome') }}">Home</a>

予想通り、URL / が生成されました。次に、より複雑なルートを扱います。

php:<a href="<?php echo $view['router']->path('_welcome') ?>">Home</a>
Annotations:// src/AppBundle/Controller/ArticleController.php // ...use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class ArticleController extends Controller{
    /**
     * @Route("/article/{slug}", name="article_show")
     */
    public function showAction($slug)
    {
        // ...
    }}
TAML:# app/config/routing.ymlarticle_show:
    path:     /article/{slug}
    defaults: { _controller: AppBundle:Article:show }
PHP:// app/config/routing.phpuse Symfony\Component\Routing\Route;use Symfony\Component\Routing\RouteCollection; $collection = new RouteCollection();$collection->add('article_show', new Route('/article/{slug}', array(
    '_controller' => 'AppBundle:Article:show',))); return $collection;

この場合、ルート名 () と . を指定する必要があります。このルートを使用して、前述のテンプレートを再定義し、記事に正しくリンクします。

XAML:<!-- app/config/routing.xml --><?xml version="1.0" encodin
g="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://symfony.com/schema/routing        http://symfony.com/schema/routing/routing-1.0.xsd">     <route id="article_show" path="/article/{slug}">
        <default key="_controller">AppBundle:Article:show</default>
    </route></routes>
Twig:{# app/Resources/views/article/recent_list.html.twig #}{% for article in articles %}
    <a href="{{ path('article_show', {'slug': article.slug}) }}">        {{ article.title }}
    </a>{% endfor %}

Twig の url 関数を使用して絶対パスを生成できます:

php:<!-- app/Resources/views/Article/recent_list.html.php --><?php foreach ($articles in $article): ?>
    <a href="<?php echo $view['router']->path('article_show', array(
        'slug' => $article->getSlug(),
    )) ?>">        <?php echo $article->getTitle() ?>
    </a><?php endforeach ?>

アセットへのリンク

通常、テンプレートにはいくつかの画像、JavaScript、スタイル ファイル、その他の Web アセットも必要です。もちろん、パスをハードコーディングすることもできます。たとえば、/images/logo.png。しかし、Symfony は Twig 関数 asset() を通じてより動的な選択肢を提供します。

Twig:<a href="{{ url('_welcome') }}">Home</a>
php:<a href="<?php echo $view['router']->url(    '_welcome',    array()) ?>">Home</a>
Twig:<img src="{{ asset('images/logo.png') }}" alt="Symfony!" /> <link href="{{ asset('css/blog.css') }}" rel="stylesheet" />

asset この関数の主な目的は、プログラムの移植性を高めることです。プログラムがホストのルート ディレクトリ (http://example.com など) にある場合、生成されるパスは /images/logo.png になります。ただし、プログラムがサブディレクトリ (http://example.com/my_app など) にある場合は、そのサブディレクトリを使用してアセット パスを生成する必要があります (/my_app/images/logo など)。 .png)。 asset 関数はこれらを管理し、「プログラムの使用方法」に基づいて対応する正しいパスを生成します。

さらに、asset 関数を使用すると、symfony はアセットにクエリ文字列 (クエリ文字列) を自動的に追加して、更新された静的リソースがデプロイ中にデプロイされないようにすることができます。キャッシュ。たとえば、/images/logo.png は、/images/logo.png?v2 のようになります。詳細については、バージョン構成の記事を参照してください。

アセット リソースの絶対 URL が必要な場合は、absolute_url() Twig 関数を使用できます:

php:<img src="<?php echo $view['assets']->getUrl('images/logo.png') ?>" alt="Symfony!" />
 
<link href="<?php echo $view['assets']->getUrl('css/blog.css') ?>" rel="stylesheet" />

Twig にスタイルシートと Javascript を含めます

すべての Web サイトには、スタイル シートと JavaScript ファイルが完全に欠かせません。 Symfony では、テンプレートの継承を使用してこれらをエレガントに処理できます。

このセクションでは、スタイルシートと JavaScript リソースを含める背後にあるアイデアを説明します。 Symfony は Assetic と呼ばれる別のクラス ライブラリをサポートしています。これにより、このアイデアに従いながら、これらのリソースを使用してより興味深いことを行うことができます。詳細については、Assetic を資産管理に使用する方法を参照してください。

まず、基本レイアウト テンプレートに 2 つのブロックを追加してリソースを保存します。1 つは stylesheets という名前で、head タグ内に配置されます。内部では、もう 1 つは javascript という名前で、body 終了タグの 1 行上に配置されます。これらのブロックには、サイト全体に必要なすべてのスタイルシートと JavaScript が含まれます。

<img src="{{ absolute_url(asset('images/logo.png')) }}" alt="Symfony!" />
Twig:{# app/Resources/views/base.html.twig #}<html>
    <head>        {# ... #}         {% block stylesheets %}
            <link href="{{ asset('css/main.css') }}" rel="stylesheet" />        {% endblock %}
    </head>
    <body>        {# ... #}         {% block javascripts %}
            <script src="{{ asset('js/main.js') }}"></script>        {% endblock %}
    </body>
</html>

これは単純すぎます!しかし、サブテンプレートから追加のスタイルシートまたは JavaScript を含めたい場合はどうすればよいでしょうか?たとえば、contact.css スタイル シートを含める必要がある連絡先ページがあり、そのページでは only が使用されているとします。連絡先ページのテンプレートでは、次のように実装できます:

php:// app/Resources/views/base.html.php<html>    <head>        <?php ... ?>         <?php $view['slots']->start('stylesheets') ?>            <link href="<?php echo $view['assets']->getUrl('css/main.css') ?>" rel="stylesheet" />        <?php $view['slots']->stop() ?>    </head>    <body>        <?php ... ?>         <?php $view['slots']->start('javascripts') ?>            <script src="<?php echo $view['assets']->getUrl('js/main.js') ?>"></script>      
  <?php $view['slots']->stop() ?>    </body>
</html>
Twig:{# app/Resources/views/contact/contact.html.twig #}{% extends 'base.html.twig' %} {% block stylesheets %}
    {{ parent() }} 
   <link href="{{ asset('css/contact.css') }}" rel="stylesheet" />{% endblock %} {# ... #}

子テンプレートでは、stylesheets ブロックをオーバーライドし、新しいスタイルシート タグをブロック内に配置するだけです。もちろん、(実際に を置換するのではなく) 親ブロックのコンテンツに追加したいだけなので、最初に parent() 関数を使用して、基本テンプレート stylesheets ブロック内のすべてのコンテンツ。

バンドルの

Resources/public フォルダーにあるアセットを含めることもできます。 php bin/consoleassets:install target [-symlink] コマンドを実行する必要があります。これにより、ファイルが正しい場所に移動 (またはシンボリックリンク) されます (デフォルトのターゲット場所は「web」フォルダーです)。 。

php:// app/Resources/views/contact/contact.html.twig<?php $view->extend('base.html.php') ?> <?php $view['slots']->start('stylesheets') ?>
    <link href="<?php echo $view['assets']->getUrl('css/contact.css') ?>" rel="stylesheet" /><?php $view['slots']->stop() ?>

最終結果は、ページに

main.csscontact.css という 2 つのスタイル シートが含まれることになります。

参照リクエスト、ユーザー、またはセッション オブジェクト

Symfony は、Twig 内のグローバル

app 変数を提供します。これは、現在のオブジェクトにアクセスするために使用できます。ユーザー、リクエスト、その他のオブジェクト。

詳細については、「Twig のアプリ変数を介してユーザー、リクエスト、セッションなどのオブジェクトにアクセスする方法」を参照してください。

出力エスケープ

コンテンツをレンダリングするとき、Twig は自動的に「出力エスケープ」を実行して、クロスサイト スクリプティング (XSS) クロスサイト攻撃から保護します。

descriptionI <3 this product であると仮定します:

<link href="{{ asset('bundles/acmedemo/css/contact.css') }}" rel="stylesheet" />

PHP テンプレートはコンテンツを自動的にエスケープしません。

詳細については、「テンプレート出力をエスケープする方法」を参照してください。

概要

Symfony のテンプレート エンジンは、必要に応じて HTML、XML、その他の形式を含むコンテンツを生成するために使用できる強力なツールです。テンプレートはコントローラーから生成されるのが一般的ですが、必須ではありません。コントローラーから返される Response オブジェクトは、テンプレートを使用することも、使用しないこともできます。

<!-- output escaping is on automatically -->{{ description }} <!-- I &lt3 this product -->
 
<!-- disable output escaping with the raw filter -->{{ description|raw }} <!-- I <3 this product -->

Symfony のテンプレートは非常に柔軟です。デフォルトでは、従来の PHP テンプレートと洗練された強力な Twig テンプレートをサポートしています。どちらも、いくつかの一般的なタスクを実行するための非常に豊富なヘルパー関数を備えています。 symfony は、より簡潔で効率的で、継承などをより適切に処理できるため、Twig テンプレートの使用を推奨します。

全体的に、これはテンプレートの問題に対処する場合に強力なツールです。場合によっては、テンプレートをレンダリングする必要がない場合もありますが、symfony ではこれはまったく問題ありません。

    blog/index.html.twig
    blog/index.html.php
    blog/index.css 。小枝