Skip to content

Commit ad4b63a

Browse files
committed
[best practice] add templates.rst
1 parent fdd55bc commit ad4b63a

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed

best_practices/templates.rst

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
テンプレート
2+
==============
3+
4+
20年前にPHPが作られた頃、開発者達はPHPのシンプルさや、PHPコードのHTMLとの親和性を愛していました。
5+
しかし、時間が経つとともに、テンプレートをもっとうまく扱うために他のテンプレート言語(例えば `Twig`_ )が作られるようになりました。
6+
7+
.. best-practice::
8+
9+
テンプレートには Twig を使いましょう。
10+
11+
一般的に、PHPのテンプレートはTwigよりも冗長になります。というのも、PHPのテンプレートは継承、自動エスケープ、フィルタや関数への名前付き引数などの、最新の機能を備えていないからです。
12+
TwigはSymfonyでのデフォルトのテンプレート言語で、PHP以外も含めた全てのテンプレートエンジンの中で最大のコミュニティサポートがあり、Drupal 8 のような負荷の高いプロジェクトでも使われています。
13+
14+
それに加えて、TwigはSymfony3.0で動作が保証される唯一のテンプレートエンジンです。
15+
実のところ、PHPテンプレートエンジンは、Symfonyの公式なサポートから除外されるでしょう。
16+
17+
テンプレートファイルの配置
18+
----------------------------
19+
20+
.. best-practice::
21+
22+
アプリケーションのテンプレートファイルは、全て ``app/Resources/views`` ディレクトリに置きましょう。
23+
24+
伝統的に、Symfonyの開発者達はアプリケーションのテンプレートファイルを、それぞれのバンドルの ``Resources/views`` ディレクトリに保存してきました。
25+
そして、その場所を参照する仮想的な名前を使っていました(例えば ``AcmeDemoBundle:Default:index.html.twig`` )
26+
27+
しかし、アプリケーションで使用するテンプレートについては、 ``app/Resources/views/`` ディレクトリに保存するほうが便利なのです。
28+
初心者にとっては、この保存先を使うことによって、ビューの名前を劇的にシンプルにすることができます。
29+
30+
================================================== ==================================
31+
バンドルに保存されたテンプレート ``app/`` に保存されたテンプレート
32+
================================================== ==================================
33+
``AcmeDemoBunde:Default:index.html.twig`` ``default/index.html.twig``
34+
``::layout.html.twig`` ``layout.html.twig``
35+
``AcmeDemoBundle::index.html.twig`` ``index.html.twig``
36+
``AcmeDemoBundle:Default:subdir/index.html.twig`` ``default/subdir/index.html.twig``
37+
``AcmeDemoBundle:Default/subdir:index.html.twig`` ``default/subdir/index.html.twig``
38+
================================================== ==================================
39+
40+
もう一つのメリットは、テンプレートを一カ所に集中させることができ、デザイナーの仕事が簡単になることです。多数のバンドル内のディレクトリに分かれたテンプレートを探しまわる必要がなくなるのです。
41+
42+
Twigエクステンション
43+
---------------------
44+
45+
.. best-practice::
46+
47+
Twigエクステンションは ``AppBundle/Twig/`` ディレクトリに置き、 ``app/config/services.yml`` を使って設定しましょう。
48+
49+
開発中のアプリケーションに、独自の ``md2html`` というTwigフィルタが必要だと想像してください。
50+
Markdown形式のコンテンツをHTMLに変換するフィルタです。
51+
52+
このフィルタを仕える王にするには、まず、Markdownパーサーの `Parsedown`_ をプロジェクトの新しい依存ライブラリとしてインストールします。
53+
54+
.. code-block:: bash
55+
56+
$ composer require erusev/parsedown
57+
58+
次に、 ``Markdown`` サービスを新しく作成します。後でTwigエクステンションから利用するためのサービスです。
59+
サービスの定義はクラスのパスだけでできます。
60+
61+
.. code-block:: yaml
62+
63+
# app/config/services.yml
64+
services:
65+
# ...
66+
markdown:
67+
class: AppBundle\Utils\Markdown
68+
69+
そして、 ``Markdown`` クラスには、MarkdownをHTMLに変換するメソッドが一つだけ必要です。::
70+
71+
namespace AppBundle\Utils;
72+
73+
class Markdown
74+
{
75+
private $parser;
76+
77+
public function __construct()
78+
{
79+
$this->parser = new \Parsedown();
80+
}
81+
82+
public function toHtml($text)
83+
{
84+
$html = $this->parser->text($text);
85+
86+
return $html;
87+
}
88+
}
89+
90+
次に、新しいTwigエクステンションを作成し、``Twig_SimpleFilter`` を使って ``md2html`` という新しいフィルタを作りましょう。
91+
Twigエクステンションには、新しく定義したばかりの ``markdown`` サービスをコンストラクタで注入します。
92+
93+
.. code-block:: php
94+
95+
namespace AppBundle\Twig;
96+
97+
use AppBundle\Utils\Markdown;
98+
99+
class AppExtension extends \Twig_Extension
100+
{
101+
private $parser;
102+
103+
public function __construct(Markdown $parser)
104+
{
105+
$this->parser = $parser;
106+
}
107+
108+
public function getFilters()
109+
{
110+
return array(
111+
new \Twig_SimpleFilter(
112+
'md2html',
113+
array($this, 'markdownToHtml'),
114+
array('is_safe' => array('html'))
115+
),
116+
);
117+
}
118+
119+
public function markdownToHtml($content)
120+
{
121+
return $this->parser->toHtml($content);
122+
}
123+
124+
public function getName()
125+
{
126+
return 'app_extension';
127+
}
128+
}
129+
130+
131+
最後に、新しいサービスを定義して、このTwigエクステンションをアプリケーションで利用できるようにします。(このサービスは開発するコードの中では利用しないので、サービス名は何でも構いません)
132+
133+
.. code-block:: yaml
134+
135+
# app/config/services.yml
136+
services:
137+
app.twig.app_extension:
138+
class: AppBundle\Twig\AppExtension
139+
arguments: ["@markdown"]
140+
tags:
141+
- { name: twig.extension }
142+
143+
144+
.. _`Twig`: http://twig.sensiolabs.org/
145+
.. _`Parsedown`: http://parsedown.org/
146+
.. _`Twig global variables`: http://symfony.com/doc/master/cookbook/templating/global_variables.html
147+
.. _`override error pages`: http://symfony.com/doc/current/cookbook/controller/error_pages.html
148+
.. _`render a template without using a controller`: http://symfony.com/doc/current/cookbook/templating/render_without_controller.html

0 commit comments

Comments
 (0)