|
| 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