質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • PHP

    19211questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

テンプレートエンジンを使わない方が良いのでしょうか?

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 840

mitsuru793

score 149

言語: PHP 7.1

ここでのエンジンはPHPそのものではなく、外部ライブラリのことです。
下記はleague/platesのサンプルコードです。

<?php
// Create new Plates instance
$templates = new League\Plates\Engine('/path/to/templates');

// Render a template
echo $templates->render('profile', ['name' => 'Jonathan']);

テンプレートファイルを使うと、メソッドではなくパスで指定することになります。
この時、下記のデメリットがあると指摘を受けました。

+ IDEの補完が効かない。
各テンプレートはメソッドではなく、テンプレートファイルで定義されているので補完が効きません。
+ IDEでテンプレートファイルにジャンプできない。
メソッドだと定義元へジャンプできますが、テンプレートだとジャンプが出来ません。
+ テンプレートファイル内で使われる変数を事前に定義できないため、型も事前に使えない。
+ 上記理由によりコードレビューがしずらい。

 補完・ジャンプ

人気のFWなら、IDEにプラグインがあると思います。
ない場合は、ファイルのあいまい検索で開くことになると思いました。
他にも良い方法があれば教えて頂きたいです。

 テンプレートファイル内で使われる変数を事前に定義できないため、型も事前に使えない。

コンストラクタやメソッドだと引数で明示的に、必要な値が分かるのですがテンプレートだと分かりません。
使われる変数はテンプレートファイルの先頭のコメントで記載するのでしょうか?

 レビューがしずらい

現在は下記のように、viewをメソッドに記述しインサートする形になっています。
私はこの手法より、テンプレートエンジンを使いlayoutを指定して入れ子にする方が分かりやすいです。
そうすれば、アクションメソッドからはテンプレートファイルを1つ指定するだけで良くなります。

<?php

// メソッドに直接Viewを記述するパターン
public function actionMethod()
{
  // Viewクラスに必要なレンダリングメソッドを定義しています。
  // 各レンダリングメソッドに必要なデータを引数で渡します。

  // ビジネスロジック
  $this->view->header($data1);
  $this->view->contentsStart($data2, $data3);
  // ビジネスロジック
  $this->view->home($data4, $data5, $data6);
  $this->view->contentsEnd();
  $this->view->contentsFooter();
  // ビジネスロジック
  return;
}

// テンプレートファイルを使うパターン
public function actionMethod()
{
  // ビジネスロジック
  // ここでの$dataは連想配列です。
  $this->renderView('home', $data);
  return;
}

テンプレートエンジンを使わないほうがメリットが大きい理由はありますでしょうか?
他の方はどうしているか、意見をいただきたいです。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

はっきり言って、このPlatesという「テンプレートエンジン」は、わざわざ入れるほどの理由はないと思います。

PHP自体がHTMLのテンプレートとして扱えることもあって、PHPで動く他のテンプレートエンジンは、以下のような短縮記法を使っていることが多いです。

  • TwigやSmartyのような、変数やループの略記法
  • HAMLのような、HTMLの略記法

これらの新しい記法は、それぞれ慣れるまでにコストがかかりますが、慣れれば速く書ける、という点でメリットがあります。


あと、CodeIgniterやCakePHPなど、PHP製のフレームワークは、「テンプレートエンジン」と銘打つことはないにしてもビューは別ファイルとなっています。これは、設定より規約の思想で、コントローラーのメソッド名とビューのファイル名を一対一対応させることで、対応は自明となります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/18 16:25

    ご回答ありがとうございます。
    最初は、既存のレガシーコードをPHPのままテンプレートファイルに移せるものとしてplatesを使いました。
    テンプレートエンジンとしては最低限の機能しか無いと思います。
    次に使うならpugやbladeがいいかなと考えてます。

    今FWだとViewは分かれていますよね。分かれていないのを知らないので、分けないほうがメリットがあるのかを知りたかったです。(テンプレートエンジンを採用しないほうがいい理由)
    テンプレートエンジンを使わないまま、ビジネスロジックとviewが相互に入れくんだものは良い気がしません。

    > 設定より規約の思想で
    railsのvimプラグインだと、このおかげですぐに対応ファイルを開くことができました。
    規約の方がxmlなどをたくさん書いたりする必要がなく便利です。

    キャンセル

checkベストアンサー

+1

人によっては以下のPHP記法でシンプルなので十分という事もありますが、

<?= $data ?>


テンプレートエンジンを使い、間に処理を挟む事でエスケープ処理等を確実に吸収してくれる役割を果たす利点はあるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/18 17:17

    ご回答ありがとうございます。
    テンプレートの継承ができるのも便利ですよね。

    キャンセル

  • 2017/09/18 17:26 編集

    CakePHP2の頃に、最初からテンプレートエンジンがついていないのでViewはPHPのままで書けば良いと言う人も結構いたので、結局は企業文化次第ですね。
    メンテナンス性が特に上がるケースで無いならば、プロジェクトやチームに合わせるのが無難かと思います。
    テンプレートの継承や親テンプレートに後から子テンプレートでデータを差し込む機能等は構造として便利です。
    LaravelのBladeを使っていますが、補完や定義はIDEの検索が賢いので困ると思った事は特にありません。

    キャンセル

  • 2017/09/26 22:16

    返信が遅れてしまいました🙏
    Bladeだと補完が効くのですね。継承については、PHPコードのままでもクラスを組み合わせて、テンプレートメソッドのような感じで作れるなと思いました。

    > PHPのままで書けば良いと言う人も結構いたので、結局は企業文化次第ですね。
    はい、そのとおりだと思います。テンプレートを使わないにしても、ロジックとview部分の混同はなるべく避けたいなと思います。

    意見を頂き参考になりました。実際に意見を聞けて良かったです。
    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    【PHP】-> この矢印2つは何を意味しますでしょうか?

    お世話になっております。Ezです。 この度、PHPを学んでおりましてわからない点があったため質問させて頂きます。 -> この矢印、クラスの変数やメソッドにアクセス

  • 解決済

    テンプレートエンジンが分からない

    ・ここで書かれている内容を理解できません ・何をしているのでしょうか? ・MyTemplateクラスの中でMyTemplateクラス自身を変数へ格納している? ・クラスって変

  • 解決済

    php 指定したフォルダ内のファイルを全て読み込んでくれるメソッド

    WEBページを制作する際に外部ソースの読み込みはできるだけまとめたいです。 例えば、phpで複数のクラスを定義しているファイルが「test」フォルダ内の「class」というデ

  • 解決済

    Cake2系での$content_for_layoutの変更方法

    お世話になります。 Cakephp2系において、予約語の$content_for_layoutを変更する方法をご存知の方はいらっしゃいますか? 具体的には下記のように

  • 解決済

    PHP動的に処理したい

    補足情報(言語/FW/ツール等のバージョンなど) PHP5.4 前提・実現したいこと PHPで汎用的な処理をしたいのですが、いまいち書き方がわからないので質問させてく

  • 解決済

    PHPで別ファイルに値を渡す方法につきまして

    初歩的なご質問で申し訳ありませんが、ご教授お願いいたします。 前提・実現したいこと フォームなどを利用して、別ファイルにて処理をし、エラーがあった場合にフォームページに戻す

  • 解決済

    CakePHP3 個別ページに下層ページを作る方法

    何かのブログサービスを作るときに大概のURLは http://****.com/post/201703143 のようにpostという記事一覧ページからその下層ページの記事個別ペ

  • 受付中

    CakePHPで月送りカレンダー

    課題で月送り機能のついたカレンダーを作成しています。 <をクリックした際には先月のカレンダーを、>ボタンで翌月のカレンダーを表示したいです。 現在先月のカレンダー表示に挑戦して

同じタグがついた質問を見る

  • PHP

    19211questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。